Small Basic - A First Look at Recursion
A First Look at Recursion
First, take a look at these Goto resources:
- Small Basic - Goto Loops
- Small Basic Curriculum: Lesson 1.5: Branching and Subroutines
- Small Basic: Control Statements > Goto statement
- Small Basic and the "Goto" keyword (History and Reasoning)
Assuming you did, then you learned how to use the Goto keyword to repeat statements in a program.
Another way to get repetition is through recursion. After performing an action, a subroutine calls itself again, either directly or indirectly through another subroutine.
You’ll find a simple example in Listing 1...
Listing 1: Infinite recursion
1 ' Recursion1.sb
2 ' Demonstrates infinite recursion
3
4 SayHello()
5
6 Sub SayHello
7 TextWindow.WriteLine("Hello!")
8 SayHello()
9 EndSub
The program starts by calling the SayHello() subroutine (Line 4). The subroutine displays the string "Hello! " (Line 7) and then calls itself (Line 8). The second call starts the subroutine over, displays "Hello!" and then calls itself again. This third call displays "Hello! " and then calls itself again, and so on (the friendliest endless loop ever). A subroutine that calls itself, like SayHello() , is a recursive subroutine. The subroutine call at Line 8 is a recursive call.
But this subroutine has a serious problem; it never stops (actually, the program eventually crashes). For the recursion to be useful, you’ll need to limit the number of times you make the recursive call. So you’ll need to include a conditional check (like an If statement) in the subroutine, to decide each time whether it should make the recursive call again. As an example, write the recursive subroutine in Listing 2 to count from a number (which is held in a variable named counter) down to 0.
Listing 2: Counting down using a recursion
1 ' CountDown.sb
2 ' Counts down using recursion
3
4 counter = 5
5 CountDown()
6 TextWindow.WriteLine("")
7
8 Sub CountDown
9 If ( counter >= 0 ) Then
10 TextWindow.Write( counter + " " )
11 counter = counter - 1
12 CountDown()
13 EndIf
14 EndSub
Output:
5 4 3 2 1 0
The main program starts by setting counter = 5 (Line 4) and then calls the CountDown() subroutine (Line 5). When the subroutine runs, it checks the value of the counter variable (Line 9). Since (5 ³ 0), your subroutine displays the number 5, followed by a space (Line 10), it decreases counter by 1 (Line 11), and calls itself again (Line 12). In the second call, because (4 ³ 0), the subroutine displays the number 4, decreases counter to 3, and calls itself again. This continues until the value of counter becomes zero. After it displays the number 0, the subroutine decreases counter by one (which makes counter = –1), then calls itself again. Since the If condition is false this time, your program doesn’t make any more recursive calls.
You could argue that this is a complicated way to write a program that counts from 5 down to 0, and that you could do this in a much simpler way. You’re right, but for some types of problems, recursion makes your program tasks simpler than you could possibly imagine!
The form of recursion used in the above example is a tail recursion because the recursive call is located at the very end of the subroutine. Small Basic also supports non tail-end recursion, where the recursive call occurs somewhere in the middle of the recursive subroutine. We won’t discuss this type of recursion though (maybe later).
SELF-CHECK
Write a program that asks your user her age. Then write a recursive subroutine that counts up from one to the user’s age.
Leave a comment if you have any questions!
Learn more about Small Basic: https://blogs.msdn.com/b/smallbasic/
Small and Basically yours,
- Ninja Ed & Majed Marji
Comments
Anonymous
April 30, 2015
Hi, Ed, I'm working on a recursion program to generate a list of subsets from a whole set. In particular, I'm looking to have it sorted in the Banker's Sequence as given in this paper: applied-math.org/subset.pdf On page 6 of that paper is a chart, showing a two-dimensional array of binary values to indicate which elements are in the subset and which are not. it's this table of 0's and 1's I'd like to generate. I'm able to code a more general (unsorted) version of this, but I'm not able to recreate the Banker's Sequence using recursive code. Further in that paper is a sample in C code, but the subroutines carry arguments, which is not available in Small Basic. Can you suggest how to code the Banker's Sequence using recursion in Small Basic? Thanks in advance!Anonymous
May 03, 2015
Mark, fantastic question. I'm not sure. Can you ask in the Small Basic forum? social.msdn.microsoft.com/.../home That also helps because one person starts to answer the question some and gives us more ideas to improve the answer. Thanks!Anonymous
January 31, 2016
Computers Today (part 1 of 6) blogs.msdn.com/.../computers-today.aspx ..... CS SPOTLIGHT: Girls in computer programming... why it matters!!! blogs.msdn.com/.../cs-spotlight-girls-in-computer-programming-why-it-matters.aspx ... Computational Thinking - Videos & Papers by Jeannette Wing blogs.msdn.com/.../computational-thinking-videos-amp-papers-by-jeannette-wing.aspxAnonymous
November 29, 2016
Aw, this was an incredibly nice post. Taking the time and actual effort to create a really good article… but what can I say… I put things off a whole lot and never seem to get nearly anything done.- Anonymous
January 06, 2017
Thanks, Holly Health!
- Anonymous