猴子喫桃問題(三種方法解決)

題目:猴子第一天摘了若干個桃子,當即吃了一半,還不解饞,又多吃了一個;第二天,喫剩下的桃子的一半,還不過癮,又多吃了一個;以後每天都喫前一天剩下的一半多一個,到第10天想再喫時,只剩下一個桃子了。問第一天共摘了多少個桃子?

———-

一、思路分析:
採用逆向思維,從後往前推斷,發現其中有相同的地方,即出現遞推公式,可以採用遞歸方法。
令S10=1,容易看出S9=2(S10+1),簡化一下
S9=2S10+2
S8=2S9+2
…..
Sn=2Sn+1+2
下面我將採用三種方式解決這個問題。(前兩種爲普通循環方式,第三種爲遞歸方式)

二、代碼講解

1、方法一(while語句)

我以while語句爲例,do while等也可以實現,留給讀者自己思考、修改

//方法一:
//  Created by Neil Wesley on 16/5/23.
//  Copyright © 2016年 Neil Wesley. All rights reserved.

#include<stdio.h>
int main()
{
    int day=9,x1=0,x2=1;
    while (day>0)
    {
        x1=(x2+1)*2;
        x2=x1;
        day--;
    }
    printf("The first day of picking peaches number is:%d\n",x1);
}

2、方法二(for循環)

//方法二:
//  Created by Neil Wesley on 16/5/23.
//  Copyright © 2016年 Neil Wesley. All rights reserved.

#include<stdio.h>
int main()
{
    int day=9,x1=0,x2=1;
    for(;day>0;day--)
    {
        x1=(x2+1)*2;
        x2=x1;
    }
    printf("The first day of picking peaches number is:%d\n",x1);
}

3、方法三(遞歸方法)

方法三:
//  Created by Neil Wesley on 16/5/23.
//  Copyright © 2016年 Neil Wesley. All rights reserved.

#include "stdio.h"
int sumPeach(int day)
{
    if (day == 10)
        return 1;
    else
    return 2 * sumPeach(day + 1) + 2;
}
int main()
{
    int sum;
    sum=sumPeach(1);
    printf("The first day of picking peaches number is:%d\n",sum);
}

三、運行結果

以上三種方法的運行結果都是:

運行結果

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