孙悟空第一天摘下若干蟠桃,当即吃了一半,还不过瘾,又多吃了一个。第二天早上,他又将剩下的蟠桃吃掉了一半,还不过瘾,又多吃了一个。之后每天早上都吃掉前一天剩下的桃子的一半零一个。到第十天早上再想吃时,就只剩下一个蟠桃了。求孙悟空第一天共摘了多少个蟠桃?
此题目利用递推的思想,倒推是一种很直观的做法。第十天是1个,根据题意后一天吃掉前一天的一半零一个。那第九天的蟠桃是第十天的一倍加1个再加上第十天的。 即:
x9 = 2 * x10 + 1 + x10 = 2 * x10 + 2 = 4
那好办了。有了这个2x+2的公式。我用一个循环代入,倒推到第一天就能知道第一天的蟠桃数了。
递推法
def eat01(n=10):
x = 1
while n > 1: # 因为从10开始循环,第十天是1个桃,终止条件不能等1,否则就多算了1天
x = (2 * x + 2)
n -= 1
return x
这道题用递归的方法也能解决。
上面的公式我们可以表示为:
x(n-1) = 2 * xn +2
因为这是一个从大到小的递减数列,递归终止条件为10,算起来不方便。我们可以把数列逆序排列一下,公式可以变成这样:
xn = 2 * x(n-1) + 2
递归公式也就出来了。
x1 = 1 ;n = 1(递归终止条件)
xn = 2 * x(n-1) + 2
递归法
def eat02(n=10):
if n == 1:
return 1
else:
return eat02(n-1) * 2 + 2
答案:1534