BBS: Inland Empire Archive Date: 03-28-93 (21:04) Number: 244 From: QUINN TYLER JACKSON Refer#: NONE To: ALL Recvd: NO Subj: Quik_Bas Faq2.1 1/ Conf: (2) Quik_Bas
QUIK_BAS FAQ2.1 **************************************************************** * * * "Ask Doctor Jackson" * * The QUIK_BAS List of Frequently Asked Questions with * * Some Simple Public Domain Solutions * * * **************************************************************** Written by Quinn Tyler Jackson The QUIK_BAS "Keeper of the FAQ" with source samples from "Various Sources" TABLE OF CONTENTS: q1.0 The BASICS of BASIC s1.0 QUIKSORT.BAS -- recursive quicksort SUB q2.0 Commonly Requested Routines s2.0 HUTHSORT.BAS -- iterative quicksort SUB s3.0 BISEARCH.BAS -- binary search FUNCTION q3.0 Advanced Topics -- "Hashing in QuickBASIC" t1.0 Hashing Collision Table s4.0 FSTPRIME.BAS -- generates 4K+3 prime number t2.0 List Management System Ratings s5.0 WORDHASH.BAS -- word distribution counter q4.0 Structured BASIC Techniques NOTE: Neither Quinn Tyler Jackson nor his company, JackMack Consulting & Development accepts responsibility for the soundness of the following advice. Certain pieces of other people's public domain code has been spliced into this FAQ for purely demonstrative purposes, and it is by no means to be assumed that Quinn Tyler Jackson is claiming ownership of such pieces of source code. All source remains the property of those who originally wrote it, as understood by Canadian, American, and International Treaty. The text portion of this file itself is hereby released into the "Public Domain" for the purposes of education and enlightenment. Q1.0 The BASICS of BASIC: Q1.4 Okay, Quinn, I've figured out FUNCTIONs and SUBs, and have even started using them with some kind of skill. Now, thing is, I come up to this thing called 'recursion.' What's this all about, and can you show me some practical application of it? A1.4 There is an old joke about the cryptic nature of dictionaries that goes something like this: re'CUR'sion (noun) 1. see recursion Actually, that's a pretty sad joke. One computer scientist's definition states: "... a recursive algorithm is one that contains a copy of itself within one of its instructions. Thus, a recursive algorithm is reminiscent of a set of mirrors in which you can see yourself looking at yourself looking at yourself." [J. Glenn Brookshear] Recursion is a powerful programming tool, and any comprehensive programming language allows it. QuickBASIC and its dialects are no exception. A simple example of recursion: SUB recurse recurse END SUB This thing will go in circles until the stack is full, crashing the program should it ever be called. It illustrates two of the main pitfalls of recursion: 1. recursion in QuickBASIC eats the stack for breakfast 2. there must be a terminating condition to exit the loop Since each call to a SUB or FUNCTION does some pushing to the stack, it must always be remembered that recursive routines will require a bit of the stack for every instance they are called. It is sometimes hard to know in advance how many times a recursive routine will end up calling itself, and therefore, one cannot know with any accuracy how much a given recursive routine will decide to rob from the stack. Be warned! This also leads to the next issue: there must ALWAYS be a terminating condition to exit the loop. Sometimes it is easy to overlook this point. Consider the above simple example. It never stops calling itself, does it? Were a theoretical computer to exist that had a theoretically infinitely large stack that could never be consumed by even the deepest level of recursion, what happens if that routine goes off into a corner and keeps calling itself? It results in a permanent time out known as a crash. (The moral of this? A bug on a i486 system is still a bug, just a bug that happens sooner.) An example of a terminating condition added to the above code: SUB recurse(n%) n% = n% + 1 IF n% < 10 THEN recurse END IF END SUB This SUB will call itself only until n% is equal to ten, at which point, it will reach its terminating state, and be finished on its job. This is a simple example, I admit, but NEVER forget to include a terminating statement in your recursive routines, or you will pay for it with a crash. Now that we have that out of the way, let's kill two birds with one stone. (It could be argued, in fact that the act of killing two birds with only one stone probably involves recursion somewhere in the solution.) Everyone wants to know a good QuickSort algorithm, and most implementations of that use recursion. So, a modified version of the QuickSort SUB from Microsoft, one that sorts an array passed to it: S1.0 QUIKSORT.BAS [F210S01.BAS] DEFINT A-Z SUB QuickSortSTR (Array() AS STRING, Low, High) ' /^\ /^\ ' | | ' Change these to any BASIC data type for this routine to ' handle other types of data arrays other than strings. ' '============================== QuickSortXXX ================================ ' QuickSortXXX works by picking a random "pivot" element in Array(), then ' moving every element that is bigger to one side of the pivot, and every ' element that is smaller to the other side. QuickSortXXX is then called ' recursively with the two subdivisions created by the pivot. Once the ' number of elements in a subdivision reaches two, the recursive calls end ' and the array is sorted. '============================================================================ ' ' Microsoft's source code modified by Quinn Tyler Jackson ' >>> Continued to next message * OLX 2.1 TD * Post all questions in this box --> []
Books at Amazon:
Back to BASIC: The History, Corruption, and Future of the Language
Hackers: Heroes of the Computer Revolution (including Tiny BASIC)
Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution
The Advent of the Algorithm: The Idea that Rules the World
Moths in the Machine: The Power and Perils of Programming
Mastering Visual Basic .NET