Python算法題----孫悟空吃蟠桃

    孫悟空第一天摘下若干蟠桃,當即吃了一半,還不過癮,又多吃了一個。第二天早上,他又將剩下的蟠桃吃掉了一半,還不過癮,又多吃了一個。之後每天早上都吃掉前一天剩下的桃子的一半零一個。到第十天早上再想吃時,就只剩下一個蟠桃了。求孫悟空第一天共摘了多少個蟠桃?


此題目利用遞推的思想,倒推是一種很直觀的做法。第十天是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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章