First, what is recursion
If a function contains a call to itself, the function is recursive. Recursion is an algorithm widely used in programming language, it usually transforms a large and complex problem layer into a small scale problem similar to the original problem to solve, the recursive strategy needs a few programs to describe the process of solving the problem of repeated computations, greatly reducing the code of the program. For example, to calculate the product of 1-9 of 9-bit numbers, the intuitive algorithm is 1*2*3*4*5*6*7*8*9, if you want to calculate the product of 1-10000, the intuitive algorithm is difficult to achieve, and recursion can be very simple implementation. Take a look at the example:
1 def fact (n):# calculates the product of a given number to one 2 if n<=1:3 return 14 else:5 return N * Fact (n-1 ) 6Print (fact (7))
The result is: 5040
Let's take a look at the recursive execution process using the example:
1 def Calc (n): 2 Print (n) 3 if n/2 > 1:4 res = calc (n/2)5 return N 6 Calc (8)
The result is:
1 82 4.03 2.0
Look again at this example:
1 defCalc (n):2 Print(n)3 ifN/2 > 1:4res = Calc (n/2)5 Print('Res:', Res)6 Print("N:", N)7 returnN8Calc (8)
The result is:
1 82 4.03 2.04 n:2.05 res:2.06 n:4.07 res:4.08 N:8
Second, generator
The generator is a function with a yield statement. A function or subroutine is returned only once, but a generator can pause execution and return an intermediate result, returning a value to the caller and pausing execution. When the next () method of the generator is called, it will proceed exactly from where it left off
Here's a look at the example:
1 deffunc ():2 Print('11111111')3 yield[1]4 Print(2222222222)5 yield26 Print(3333333333)7 yield38 9ret=func ()TenR1=ret.__next__() One Print(R1) AR2=ret.__next__() - Print(R2) -R3=ret.__next__() the Print(R3)
The result is:
1 111111112 [1]3 22222222224 25 33333333336 3
Because Python's for Loop has next () calls and handles to stopiteration, using a for loop instead of a manual iteration through a generator (or an iterator of that sort) is always a lot more concise and beautiful. Cases:
1 deffunc ():2 Print('11111111')3 yield[1]4 Print(2222222222)5 yield26 Print(3333333333)7 yield38ret=func ()9 forIinchret:Ten Print(i)
The result is the same as before.
These simple examples should give you a little idea of how the generator works. In addition to next () to get the next generated value, the user can return the value to the generator [Send ()], throw an exception in the generator, and require the generator to exit [Close ()]
Here is a simple example that shows these features.
1 def counter (start_at=0): 2 count = Start_at 3 while 4 val = (yield count) if Val is None: 5 count = val 6 else : 7 count + = 1
The generator comes with an initialized value, with a 1 cumulative count for each call to the generator [next ()]. The user has the option to reset this value if they really want to call send with a new value () instead of calling next (). This generator is always running, so if you want to end it, call the Close () method. If we run this code interactively, we will get the following output:
1>>> count = Counter (5)2>>>Count.next ()354>>>Count.next ()566>>> Count.send (9)798>>>Count.next ()910Ten>>>count.close () One>>>Count.next () A Traceback (most recent): -File"<stdin>", Line 1,inch<module> -Stopiteration
Python function recursion and generator