23函数----递归

递归调用是函数嵌套调用的一种特殊形式,函数在调用时,直接或间接调用了自身
python解释器的内存管理机制为了防止无限制调用,对递归调用做了最大的层级限制

三个特点:

1、要有确定的结束条件

2、问题规模要一步一步的减小

3、函数的等价关系式

 

例1、问路

import time
person_list = ['cc', 'dd','ff','ll', 'ee', 'mm']

def ask_way(person_list):
    if len(person_list) == 0:
        return '没有知道'
    person = person_list.pop(0)  #问题的规模要减少
    if person == 'ee':  #结束的条件
        return '{}说:路在318号'.format(person)
    print('hi,{},???'.format(person))
    print('你去问{}'.format(person_list))
    time.sleep(2)
    return ask_way(person_list)

res = ask_way(person_list)
print(res)

 例2、阶乘

# 计算阶乘
def func(i):
    if i == 1:  #要有明确的结束条件
        return 1
    return func(i-1) * (i)

s = func(3)
print(s)

# 也可以用普通的循环的来实现阶乘
def func(i):
    s = 1
    for x in range(1,i+1):
        s *= x
    print(s)

func(3)

 例3、斐波那契数列(黄金分割数列、兔子数列)

# 非递归方式
def f(n):
    x1,x2 = 0,1
    while x1<n:
        x1,x2 = x2,x1+x2
        yield x1  #yield,生成器
g = f(40)
for i in g:print(i,end=' ')


def fib(n):
    a,b = 0,1
    for i in range(n):
        a, b = b, a+b
    return a

res = fib(8)
print(res)

# 递归1,只是输出第n个数
def f(n):
    if n == 1:return 1
    if n == 0:return 0
    else:
        return f(n-1)+f(n-2)

res = f(8)
print(res)


# 递归2
def fib(a,b,stop):
    if a>stop:
        return
    print(a,end=' ')
    fib(b,a+b,stop)

fib(1,1,34)

 4:打印出杨辉三角形


1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1

其实这种问题,看的更多的不是编程技巧,而是对问题的理解程度,要找到问题其中的规律,然后才有可能用编程语言来表达问题,进而解决问题。
def f(i,j):#得到(i,j)的值
    if j == 1 or i==j:
        return 1
    return f(i-1,j-1)+f(i-1,j)


def fun(n):
    for i in range(1,n):
        for j in range(1,i+1):
            print(f(i,j), end=' ')
        print()

fun(6)

 

 
posted @ 2021-04-04 00:32  cheng4632  阅读(86)  评论(0编辑  收藏  举报