递归调用是函数嵌套调用的一种特殊形式,函数在调用时,直接或间接调用了自身
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)
原文:https://www.cnblogs.com/cc-world/p/14008366.html