Home  >  Article  >  Backend Development  >  python function recursion and generator

python function recursion and generator

高洛峰
高洛峰Original
2017-03-03 15:08:491334browse

1. What is recursion

If a function contains a call to itself, the function is recursive. As an algorithm, recursion is widely used in programming languages. It usually converts a large and complex problem into a smaller problem similar to the original problem to solve. The recursive strategy can be described with only a small number of programs. The multiple repeated calculations required to solve the problem greatly reduce the amount of code in the program. For example, to calculate the product of 9-digit numbers from 1 to 9, 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. Implemented, and recursion can be easily implemented. Please look at the example:

def fact(n):#计算给定数字到一的乘积
   if n<=1:
     return 1
   else:
     return n * fact(n-1) 
print (fact(7))

The result is: 5040

Let’s use an example to see the recursive execution process:

def calc(n):
   print(n)
   if n/2 > 1:
     res = calc(n/2)
   return n
 calc(8)

The result is:

8
4.0
2.0

Look at this example again:

def calc(n):
  print(n)
  if n/2 > 1:
    res = calc(n/2)
    print(&#39;res:&#39;,res)
  print("N:",n)
  return n
calc(8)

The result is:

8
4.0
2.0
N: 2.0
res: 2.0
N: 4.0
res: 4.0
N: 8

#2. Generator

The generator is a function with a yield statement. A function or subroutine returns only once, but a generator can pause execution and return an intermediate result, return a value to the caller and pause execution. When the generator's next() method is called, it will continue exactly where it left off

See an example below:

def func():
  print(&#39;11111111&#39;)
  yield [1]
  print(2222222222)
  yield 2
  print(3333333333)
  yield 3

ret=func()
r1=ret.__next__()
print(r1)
r2=ret.__next__()
print(r2)
r3=ret.__next__()
print(r3)

The result is:

11111111
[1]
2222222222
2
3333333333
3

Since python’s for loop has next() call and processing of StopIteration, use a for loop instead Manually iterating through a generator (or iterator of that thing) is always much cleaner and prettier. Example:

def func():
  print(&#39;11111111&#39;)
  yield [1]
  print(2222222222)
  yield 2
  print(3333333333)
  yield 3
ret=func()
for i in ret:
  print(i)

The result is the same as before.

These simple examples should give you a little idea of ​​how generators work. In addition to next() to get the next generated value, users can send values ​​back to the generator [send()], throw exceptions in the generator, and ask the generator to exit [close()]

Below is a simple example that demonstrates these features.

def counter(start_at=0):
  count = start_at
  while True:
    val = (yield count) if val is not None:
    count = val
  else:
    count += 1

The generator comes with an initialized value that counts up by 1 for each call to the generator [next()]. Users have the option of resetting this value if they really want to call send() with the new value instead of calling next(). This generator runs forever, so if you want to terminate it, call the close() method. If we run this code interactively, we will get the following output:

>>> count = counter(5)
>>> count.next()
5
>>> count.next()
6
>>> count.send(9)
9
>>> count.next()
10
>>> count.close()
>>> count.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration

The above article on in-depth understanding of Python function recursion and generators is what I share with you. The entire content is here, I hope it can give everyone a reference, and I also hope everyone will support the PHP Chinese website.

For more articles related to python function recursion and generators, please pay attention to the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn