Category:Recursion: Difference between revisions
m
Twiddle phrases. Twiddle the pseudocode?
(Added tail recursion text to this article) |
m (Twiddle phrases. Twiddle the pseudocode?) |
||
(9 intermediate revisions by 5 users not shown) | |||
Line 1:
[[Category:Solutions by Programming Task]][[Category:Encyclopedia]]'''Recursion''' is the idea that a function can come to an answer by repeatedly calling itself with new arguments until a "base case" or "end condition" is met. One
A pseudocode function to demonstrate recursion would look something like this:
'''function''' F '''with''' arguments▼
''//optional additional conditions which may or may not have direct answers''
More than one end condition is allowed. More than one recursion condition is allowed. More generally, the function may be able to deliver the result for some arguments but not for others, and for those cases it is able to compose the result from some combination of function calls with different arguments. Simple recursion is when it invokes itself, but a group of functions may be involved in mutual recursion. The analyst's task is to devise a plan that will always end with a result for the desired initial invocations. In the case of the factorial function, this is easily seen since factorial(n) invokes factorial(n - 1) and so on: for every positive integer this sequence must eventually reach zero and the result for factorial(0) is directly available. A more complex example is provided by the [[wp:Ackermann_function]]
Recursion is often difficult for programming students to grasp, but it's not much different from any other function call. In a normal function call, execution moves to another function with the given parameters. In a recursive function call, execution moves to the same function, but the parameters still act as they would in a normal function call.
▲ function F with arguments
▲ if end condition is not met
▲ return F called with new set of arguments
▲ else
▲ return end condition value
Many recursion problems can be solved with an iterative method, or using a [[loop]] of some sort (usually recursion and iteration are contrasted in programming, even though recursion is a specific type of iteration). In some languages, the factorial example is best done with a loop because of function call overhead. Some other languages, like [[Scheme]], are designed to favor recursion over explicit looping, using
'''Tail recursion''' is a specific type of recursion where the
The benefits of this optimization are primarily [[System stack|stack]] related. Transforming recursive functions into iterative functions can save memory and time.
Memory is saved by reducing an entire call stack
Time is saved because each function return takes a long time relative to a simple branch. This benefit is usually not noticed unless function calls are made that would result in large and/or complex call trees. For example, the time difference between iterative and recursive calls of <tt>fibonacci(2)</tt> would probably be minimal (if there is a difference at all), but the time difference for the call <tt>fibonacci(40)</tt> would probably be drastic.
Sometimes, tail-recursive functions are coded in a way that makes them not tail-recursive. The example above could become tail-recursive if it were transformed to look like this:
'''function''' F '''with''' arguments
'''if''' ''end condition is met''
'''return''' ''end condition value''
''//optional additional conditions which may or may not have direct answers''
'''else'''
'''return''' ''F called with new set of arguments''
Below is a list of examples of recursion in computing.
|