python再帰関数のケース


1、月給は日によって支給して、初日に1銭をあげて、それから、翌日は前日の2倍で、それでは30日後の給料はいくらですか?
問題解決の考え方:
初日0.01
翌日0.01*2
3日目0.01*2^2
...
30日目0.01*2^29
コードは次のとおりです.
def money(n):
    if n <= 1:
        return 0.01
    else:
        return money(n-1)+0.01*2**(n-1)
print(money(30))

実行結果:
10737418.23

2、サルは毎日前日の半分以上の桃を食べて、10日目に桃が1つ残っています.初日に桃が何個ありますか.
問題解決の考え方:
 1 :num(1)=(num(2)+1)*2
....
 8 :num(8) = (num(9)+1)*2
 9 :num(9) = (1+1)*2
 10 :1

コードは次のとおりです.
def num(d):
    if d >= 10:
        return 1
    else:
        return (num(d+1)+1)*2
print(num(1))

実行結果:
1534

3、ボールは100メートルの高さから自由に落ちて、着地するたびに元の高さの半分に跳ね返った.更に落ちて、それが10回目に着地する時を求めて、共に何メートルを通りますか?10回目のリバウンドはどれくらいですか?
問題解決の考え方:
1回目の着地通過距離:f(1)=100
2回目の着地通過距離:f(1)+100*(1/2)*(2-2)
3回目の着地通過距離:f(2)+100*(1/2)*(3-2)
...
10回目の着地通過距離:f(9)+100*(1/2)*(10-2)
コードは次のとおりです.
def height(n):
    #      
    if n == 1:
        return 100
    else:
        return height(n-1)+100*((1/2)**(n-2))
def h1(n):
    #      
    if n == 1:
        return 50
    else:
        return h1(n-1)/2

print(' 10       ',height(10))
print(' 10       ',h1(10))

実行結果:
 10        299.609375
 10        0.09765625