Python 递归函数

2021-01-21  本文已影响0人  Alexander_Zz

一、函数执行流程

http://pythontutor.com/visualize.html#mode=edit

示例.png 示例.png 示例.png

二、递归 Recursion

2.1 斐波那契数列 Fibonacci number:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ....
a = 0
b = 1
n = 10   # 55
# 循环实现
for i in range(n -1):
    a, b = b, a + b
else:
    print(b)

# 递归实现
def fib(n):
    return 1 if n < 3 else fib(n-1) + fib(n-2)
2.2 递归要求
2.3 递归性能 fib(35) 比较
2.4 递归的性能
def fib(n, a=0, b=1):
    a, b = b, a+b
    if n == 1:
        return a
    return fib(n-1, a, b)

print(fib(4))
2.5 间接递归
def foo1():
    foo2()

def foo2():
    foo1()

foo1()

间接递归,是通过别的函数调用了函数自身
拖构成了循环递归调用是非常危险的,但往往这种情况在代码复杂情况下,很可能发生这种调用,要用代码的规范来避免递归调用的发生

三、递归总结

四、递归练习

4.1 求 n 的阶乘
def fac(n):
    if n == 1:
        return 1
    return n * fac(n-1)
  
def fac(n):
    return 1 if n < 2 else n * fac(n-1)
n = 6
fac = 1
for i in range(n, 0, -1):   # 计数器 n 次
    fac = fac * i
print(fac)

def fac1(n, fac=1):
    fac = fac * n
    if n == 1:
        return fac
    return fac1(n-1, fac)
4.2 将一个数逆序放入列表中,例如 1234 => [4, 3, 2, 1]
target = []
def revert(data):
    target.append(data[-1])
    if len(data) == 1:
        return target
    return revert(data[:-1])

revert('1234')

def revert(data, target=None):
    if target is None:
        target = list()
    target.append(data[-1])
    if len(data) == 1:
        return target
    return revert(data[:-1], target)

revert('1234')

def revert(data):
    if data == '':
        return []
    return [data[-1]] + revert(data[:-1])

revert('1234')
def revert(data, target=None):
    if target is None:
        target = list()
    if not isinstance(target, list):
        return
    
    x, y = divmod(data, 10)
    target.append(y)

    if x:
        return revert(x, target)
    return target

revert(120340)
4.3 解决猴子吃桃问题
def peach(days=1):
    if days == 10:
        return 1
    return 2 * (peach(days+1) +1)

def peach(days=10):
    if days == 1:
        return 1
    return 2 * (peach(days-1) + 1)
peach = 1
for i in range(9):
    peach = 2 * (peach + 1)
print(peach)

def fn(days=9, peach=1):
    peach = 2 * (peach + 1)
    if days == 1:
        return peach
    return fn(days-1, peach)
fn()
上一篇 下一篇

猜你喜欢

热点阅读