个人对递归的理解(python)
递归:函数自己调用自己的。
举栗子说明:假设你在一个电影院,你想知道自己坐在哪一排,但是前面人很多,你懒得去数了,于是你问前一排的人「你坐在哪一排?」,这样前面的人 (代号 A) 回答你以后,你就知道自己在哪一排了——只要把 A 的答案加一,就是自己所在的排了。不料 A 比你还懒,他也不想数,于是他也问他前面的人 B「你坐在哪一排?」,这样 A 可以用和你一模一样的步骤知道自己所在的排。然后 B 也如法炮制。直到他们这一串人问到了最前面的一排,第一排的人告诉问问题的人「我在第一排」。最后大家就都知道自己在哪一排了。
这就是递归,先递后归,一般传递过程不进行计算,而是归来的时候才计算。递归分为头递归和尾递归,递归和循环是可以互相转换的。
头递归:头递归只有第一个节点知道最终结果;调用过程不需计算,只需‘归’时计算结果
尾递归:尾递归上的每一个节点都知道最终结果,尾递归需要向后一个调用传递信息
一般我们写的递归是头递归,因为这比较符合我们大脑的思维方式,较容易理解。
下面举一些递归的栗子:
1.阶乘
def Fac(n):
if n==0:#定义0的阶乘为1,即递归推出条件
return 1
else:
return n*Fac(n-1) #递归的调用方法
a = eval(input('输入数字:'))
print(Fac(a))
2.斐波那契数列
(数列从第3项开始,每一项都等于前两项之和,也称兔子数列)
def fun(x):
if x==1:
return 1
elif x==2:
return 1 #前两项为1,是退出递归的条件
else:
return fun(x-2)+fun(x-1) #调用方法,某一项等于前两项之和
a = eval(input('输入数字:'))
print(fun(a))
3.汉诺塔(规则请自行百度)
def Han(n,a,b,c):
if n == 1:
print(a, '-->', c)
else:
Han(n-1,a,c,b)
Han(1,a,b,c)
Han(n-1,b,a,c)
print(Han(3,'A','B','C'))
注意形参是小写字母,实参是大写字母
比如Han(n-1,a,b,c)中,a=A,c=B,b=C,所以这里是打印
a–>c就是A–>B #把n-1个圆盘放到B