This article mainly introduces the PHP data structure based on recursion, has a certain reference value, now share to everyone, have the need for friends can refer to
What is recursion?
As mentioned before, recursion is a solution that breaks down big problems into small problems. In general, recursion is called the function itself. That might sound strange, in fact, in recursion, the function really has to call itself.
A chestnut
In mathematics, for example, we all know the concept of "factorial". For example, the factorial of 5 is 5*4*3*2*1
.
5! = 5 * 4!
4! = 4 * 3!
3! = 3 * 2!
2! = 2 * 1!
1! = 1 * 0!
0! = 1
We can sum up the law of finding the factorial of N, that is n! = n * (n-1)!
This is the embodiment of recursion. As you can see, we turn the factorial of the 5 into another small problem in one step.
Characteristics of recursive algorithms
Each recursive call must be based on a small sub-problem. For example, the factorial of 5 is the factorial of 5 by 4.
Recursion must have a base case. For example, the base case of factorial is 0, and when the condition is 0, the recursion is stopped.
Avoid cyclic calls in recursion, or the last computer will show stack overflow errors.
function factorial (int $n): int{ if ($n = 0) { return 1; } return $n * Factorial ($n-1);}
Looking at the code above, we can see the solution to the factorial problem we have a basic condition is that when n is 0, we return 1. If this condition is not met, we return the n
multiplication factorial(n)
, which conforms to the first and third of the recursive characteristics. We avoided looping calls because we decomposed each recursive call into a small sub-problem of a big problem. The above algorithm thought can be expressed as:
Recursive vs Iteration
The recursive code above can also be implemented using an iterative approach
function factorial (int $n): int{ $result = 1; for ($i = $n; $i > 0; $i-) { $result *= $n; } return $result;}
If an issue can be easily solved using iterations, why should we use recursion?
Recursion is used to deal with more complex problems, and not all problems can be solved simply by using iterations. Recursively uses function calls to manage the call stack, so more and more time and memory are used than iterative recursion. Also, in an iteration, we have a result for each step, but in recursion we have to wait until the base case execution finishes to have any results. Looking at the example above, we found that in the recursive algorithm we do not have any variables or declarations to save the results, and in the iterative algorithm, we use $result to save the returned results every time.
Fibonacci sequence
In mathematics, the Fibonacci sequence is a special integer sequence, and each number in the sequence is generated by a sum of two additional numbers. The rules are as follows:
function Fibonacci ($n) { if ($n = = 0) { return 0; } if ($n = = 1) { return 1; } Return Fibonacci ($n-1) + Fibonacci ($-2);}
Maximum male factor
Another common problem with recursive algorithms is to find the maximum common factor of two numbers.
function gcd (int $a, int $b) { if ($b = = 0) { return $a; } Return gcd ($b, $a% $b);}
Recursive type
In each recursive call, the function calls itself only once, which is called linear recursion.
In binary recursion, each recursive call function calls itself two times. The algorithm for solving the Fibonacci sequence is binary recursion, in addition to the binary search, divide and conquer algorithm, merge sort, etc. also used two points recursion.
A recursive return is called a tail recursion when there is no waiting operation. In the Fibonacci algorithm, the return value needs to be multiplied by the previous recursive return value, so he is not the tail recursion, and the algorithm that solves the maximum common divisor is the tail recursion. Tail recursion is a form of linear recursion.
For example, in each recursive call there is a () call B (), B () call a (), such recursion is called reciprocal recursion.
When a recursive function calls itself recursively as a parameter, it is called nested recursion. A common chestnut is the Ackermann function, which looks at the following expression.
Looking at the last line, you can see that the second parameter is the recursive function itself.
Next section
The next article uses recursion to solve some of the problems that are encountered in real-world development, such as building n-level classifications, building nested comments, traversing directory files, and so on.
The above is the whole content of this article, I hope that everyone's learning has helped, more relevant content please pay attention to topic.alibabacloud.com!