5.python~递归(em......)

本文探讨了Python编程中的递归概念,通过整数阶乘、汉诺塔、斐波那契数列、求最大公约数、跳台阶等经典例子详细阐述递归的运用。讲解了递归公式和终止条件的重要性,并对跳台阶问题的两种变化形式进行了分析,最后得出变态跳台阶问题的等比数列解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近的学习总是绕不开递归的这个东西了,我决定学一下这个东西,刚接触还是理解有点问题,感觉理解了,也就那么回事,可是合上书,关掉博客,自己一写就一脸懵逼。多写写应该会好点,练上二十到题我再来BB。

1.递归问题,从整数阶乘引入该问题。

设函数 f ( n ) = n ! = 1 ∗ 2 ∗ 3 ∗ ⋅ ⋅ ⋅ ∗ ( n − 1 ) ∗ n f(n)=n!=1 * 2 * 3 * ···* (n-1) * n f(n)=n!=123(n1)n
那么这个函数就可以看成是 f ( n ) = n ∗ f ( n − 1 ) f(n)=n * f(n-1) f(n)=nf(n1)
这个时候就找到了递归的公式,最重要的一步已经完成,接下来一定要做的事就是找到终止递归的条件!!一定要给递归找一个出口,否则就无限迭代下去了。这个一般比较容易,就是这个问题的开始部分或者结尾部分,比如这个阶乘问题的出口就是 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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值