递归分鱼是一个经典的递归问题。问题描述如下:
有三个人一起分鱼,共有n条鱼。规定每人每次只能拿一条或者两条鱼,不能不拿或者拿多于两条。问有多少种分法。
解决这个问题可以使用递归的方法。假设f(n)表示有n条鱼时的分法总数。当n=0时,表示没有剩余鱼可供分配,只有一种分法,即每个人都不拿鱼,返回1。当n=1或者n=2时,也只有一种分法,即每个人都拿一条鱼或者两条鱼,返回1。当n>2时,每个人可以选择拿一条鱼或者两条鱼,那么就有两种情况,分别是第一个人拿一条鱼,剩下的鱼有f(n-1)种分法;第一个人拿两条鱼,剩下的鱼有f(n-2)种分法。因此,可以得到递推关系式:f(n) = f(n-1) + f(n-2)。
接下来,可以编写递归函数来解决这个问题。
def fish(n):
if n == 0:
return 1
elif n == 1 or n == 2:
return 1
else:
return fish(n-1) + fish(n-2)
使用上述函数,可以计算出给定鱼数量下的分法总数。
n = 5
print(fish(n)) # 输出:8
对于较大的n,上述递归方法的效率可能较低。可以使用动态规划的方法来提高效率。原理是将递归过程中的中间结果保存起来,避免重复计算。