最近的学习总是绕不开递归的这个东西了,我决定学一下这个东西,刚接触还是理解有点问题,感觉理解了,也就那么回事,可是合上书,关掉博客,自己一写就一脸懵逼。多写写应该会好点,练上二十到题我再来BB。
1.递归问题,从整数阶乘引入该问题。
设函数
f
(
n
)
=
n
!
=
1
∗
2
∗
3
∗
⋅
⋅
⋅
∗
(
n
−
1
)
∗
n
f(n)=n!=1 * 2 * 3 * ···* (n-1) * n
f(n)=n!=1∗2∗3∗⋅⋅⋅∗(n−1)∗n
那么这个函数就可以看成是
f
(
n
)
=
n
∗
f
(
n
−
1
)
f(n)=n * f(n-1)
f(n)=n∗f(n−1),
这个时候就找到了递归的公式,最重要的一步已经完成,接下来一定要做的事就是找到终止递归的条件!!一定要给递归找一个出口,否则就无限迭代下去了。这个一般比较容易,就是这个问题的开始部分或者结尾部分,比如这个阶乘问题的出口就是
n
=
1
n=1
n=1时,
f
(
n
)
=
1
f(n)=1
f(n)=1。
阶乘的递归代码如下:
def func(n):
if n == 1:
return 1
else:
return n * func(n - 1)
迭代的阶乘是:
# 迭代的阶乘
def func(n):
result = n
for i in range(1, n):
result *= i
return result
2. 汉诺塔
def hanoi(n, x, y, z): ## 将n个塔牌从x借助y,移动到z
if n == 1:
print(x,'-->',z) ## 递归的出口
else:
hanoi(n-1,x,z,y) ## 相当于将n-1个塔牌从x借助z,移动到y,然后将x上面的第n个移动到z
print(x,'-->',z)
hanoi(n-1,y,x,z)
n= int(input("请输入汉诺塔的层数:"))
hanoi(n,'x','y','z')
3.斐波那契数列
def fab(n): # 1 1 2 3 5 8 13 21 34 55···
if n == 1 or n == 2:
return 1
else:
return fab(n-1)+fab(n-2)
4.求最大公约数(辗转相除法)
def gcd(a,b):
a,b = (a,b) if a>=b else (b,a)
if a%b ==0:
return b
else:
return gcd(b,a%b)
5. 跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
先找规律。从规律中可以抽出迭代公式或者递归规律。
f(1) = 1, f(2) = 2, f(3) = 3, f(4) = 5, 可以总结出f(n) = f(n-1) + f(n-2)的规律
## py2.7
class Solution:
def jumpFloor(self, number):
# write code here
if number==1:
return 1
else:
a = 1
b = 1
for i in range(number):
a,b = b, a+b
return a
## py3.7
def jumpfloor(n):
if n <= 3:
return n
else:
return jumpfloor(n-1)+jumpfloor(n-2)
print(jumpfloor(int(input())))
6.变态跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
这个问题:
链接:https://www.nowcoder.com/questionTerminal/22243d016f6b47f2a6928b4313c85387
关于本题,前提是n个台阶会有一次n阶的跳法。分析如下:
f(1) = 1
f(2) = f(2-1) + f(2-2) //f(2-2) 表示2阶一次跳2阶的次数。
f(3) = f(3-1) + f(3-2) + f(3-3)
f(n) = f(n-1) + f(n-2) + f(n-3) + … + f(n-(n-1)) + f(n-n)
说明:
1)这里的f(n) 代表的是n个台阶有一次1,2,…n阶的 跳法数。
2)n = 1时,只有1种跳法,f(1) = 1
3) n = 2时,会有两个跳得方式,一次1阶或者2阶,这回归到了问题(1) ,f(2) = f(2-1) + f(2-2)
4) n = 3时,会有三种跳得方式,1阶、2阶、3阶,
那么就是第一次跳出1阶后面剩下:f(3-1);第一次跳出2阶,剩下f(3-2);第一次3阶,那么剩下f(3-3)
因此结论是f(3) = f(3-1)+f(3-2)+f(3-3)
5) n = n时,会有n中跳的方式,1阶、2阶…n阶,得出结论:
f(n) = f(n-1)+f(n-2)+…+f(n-(n-1)) + f(n-n) => f(0) + f(1) + f(2) + f(3) + … + f(n-1)
6) 由以上已经是一种结论,但是为了简单,我们可以继续简化:
f(n-1) = f(0) + f(1)+f(2)+f(3) + … + f((n-1)-1) = f(0) + f(1) + f(2) + f(3) + … + f(n-2)
f(n) = f(0) + f(1) + f(2) + f(3) + … + f(n-2) + f(n-1) = f(n-1) + f(n-1)
可以得出:
f(n) = 2*f(n-1)
这是一个等比数列,还可以求出通项式:2^(n-1)
# 这是一个很赖皮的解法,哈哈哈,全靠数学功底
def func(n):
return 2**(n-1)
# 递归
def jumpfloor(n):
if n ==1:
return 1
else:
return 2*jumpfloor(n-1)