Difference between revisions of "Recursion"
Line 9: | Line 9: | ||
If its parameter, <code>n</code>, is greater than 1, <code>Factorial2</code> calls itself with the actual parameter value <code>n - 1</code>. Otherwise, it simply returns 1. Like any normal recursive function, it has a termination condition under which the recursion stops — when <code>n <= 1</code>. | If its parameter, <code>n</code>, is greater than 1, <code>Factorial2</code> calls itself with the actual parameter value <code>n - 1</code>. Otherwise, it simply returns 1. Like any normal recursive function, it has a termination condition under which the recursion stops — when <code>n <= 1</code>. | ||
− | <Tip Title="Tip"> The built-in function Factorial does the same, and is fully abstractable, to boot. We define Factorial2 here as a simple example to demonstrate key ideas.</Tip > | + | <Tip Title="Tip"> The built-in function Factorial does the same, and is fully abstractable, to boot. We define <code>Factorial2</code> here as a simple example to demonstrate key ideas.</Tip > |
Normally, if you try to use a function in its own definition, it complains about a cyclic dependency loop. To enable recursion, you must display and set the '''Recursive''' attribute: | Normally, if you try to use a function in its own definition, it complains about a cyclic dependency loop. To enable recursion, you must display and set the '''Recursive''' attribute: | ||
− | # Select '''Attributes''' from the | + | # Select '''Attributes''' from the [[Object menu]]. |
#::[[File:procedure_attributes.png|200px]] | #::[[File:procedure_attributes.png|200px]] | ||
#Select '''Functions''' from the '''Class''' menu. | #Select '''Functions''' from the '''Class''' menu. | ||
− | #Scroll down the list of attributes and click '''Recursive''' twice, so that it shows √, meaning that the recursive attribute is displayed for each function in its | + | #Scroll down the list of attributes and click '''Recursive''' twice, so that it shows √, meaning that the recursive attribute is displayed for each function in its [[Object window]] and the [[Attribute panel]]. |
#Check '''OK''' to close '''Attributes''' dialog. | #Check '''OK''' to close '''Attributes''' dialog. | ||
Line 22: | Line 22: | ||
For each function for which you wish to enable recursion: | For each function for which you wish to enable recursion: | ||
− | <ol start="5"><li>Open the | + | <ol start="5"><li>Open the [[Object window]] for the function by double-clicking its node (or selecting the node and clicking the '''Object''' button).</li></ol> |
<ol start="6"><li>Type <code>1</code> into its '''Recursive''' field.</li></ol> | <ol start="6"><li>Type <code>1</code> into its '''Recursive''' field.</li></ol> | ||
Line 47: | Line 47: | ||
* [[Error_Messages/41036|Error Message 41036]] | * [[Error_Messages/41036|Error Message 41036]] | ||
* [[Error_Messages/40938|Error message 40938]] | * [[Error_Messages/40938|Error message 40938]] | ||
+ | * [[IF a THEN b ELSE c]] | ||
<footer>For and While Loops / {{PAGENAME}} / Local Indexes</footer> | <footer>For and While Loops / {{PAGENAME}} / Local Indexes</footer> |
Revision as of 20:37, 20 May 2016
A recursive function is a function that calls itself within its definition. This is often a convenient way to define a function, and sometimes the only way. As an example, consider this definition of factorial:
Function Factorial2(n: Positive Atom)
Definition: IF n > 1 THEN N*Factorial2(n - 1) ELSE 1
If its parameter, n
, is greater than 1, Factorial2
calls itself with the actual parameter value n - 1
. Otherwise, it simply returns 1. Like any normal recursive function, it has a termination condition under which the recursion stops — when n <= 1
.
Factorial2
here as a simple example to demonstrate key ideas.Normally, if you try to use a function in its own definition, it complains about a cyclic dependency loop. To enable recursion, you must display and set the Recursive attribute:
- Select Attributes from the Object menu.
- Select Functions from the Class menu.
- Scroll down the list of attributes and click Recursive twice, so that it shows √, meaning that the recursive attribute is displayed for each function in its Object window and the Attribute panel.
- Check OK to close Attributes dialog.
For each function for which you wish to enable recursion:
- Open the Object window for the function by double-clicking its node (or selecting the node and clicking the Object button).
- Type
1
into its Recursive field.
As another example, consider this recursive function to compute a list of the prime factors of an integer, x
, equal to or greater than y
:
Function Prime_factors(x, y: Positive Atom)
Definition:
Var n := Floor(x/y);
IF n < y THEN [x]
ELSE IF x = n*y THEN Concat([y], Factors(n, y))
ELSE Prime_factors(x, y + 1)
Factors(60, 2) → [2, 2, 3, 5]
In essence, Prime_factors
says to compute n
as x
divided by y
, rounded down. If y
is greater than n
, then x
is the last factor, so return x
as a list. If x
is an exact factor of y
, then concatenate x
with any factors of n
, equal or greater than n
. Otherwise, try y + 1
as a factor.
See also
- User-Defined Functions
- Function calls and parameters
- Error Message 41036
- Error message 40938
- IF a THEN b ELSE c
Enable comment auto-refresher