C 之猴子吃桃兒問題的解法 猴子吐桃兒

2021-09-07 03:50:02 字數 863 閱讀 6081

猴子第一天摘了許多個桃子,先吃了所有桃子的一半,後又吃了乙個;第二天又吃了剩下桃子的一半,後又吃了乙個……第十天,剩1個桃子。問:猴子第一天摘了多少個桃子?

首先對「猴子吃桃」的過程進行正向推導,設:猴子第一天摘了n個桃子,第n天剩ln個桃子。則——

l1 = n/2 - 1

l2 = l1/2 - 1/2 - 1

l3 = l2/2 - 1/2^2 - 1

ln = l(n-1)/2 - 1;

然後對「猴子吐桃」的過程進行逆向推導,因為ln = l(n-1)/2 - 1,所以l(n-1) = 2ln + 2。即——

從某一天剩餘的桃子量我們可以逆推出上一天的桃子量。可以想象猴子把當天吃的桃子吐了出來(先吐出乙個,再吐出目前桃子數2倍的桃子),就是上一天吃剩下的桃子量。

由於我們已經知道了第10天猴子吃完桃後剩餘桃子數為1,這樣就可以把「第10天」和「1個桃」作為兩個引數傳入乙個「猴子吐桃」的函式中,讓猴子把吃的桃兒都吐出來,一直吐到第1天,並返回第一天猴子摘的桃子數:

using

system;

namespace

monkeyeatpeaches

private

static

int monkeyvomitpeaches(int days, int

left)

else}}

}

結果得出:

答:第一天猴子摘了3070個桃子。

其實這個遞迴法就相當於乙個for迴圈,所以時間複雜度為o(n)。

可以進一步研究一下遞迴演算法的時間複雜度。

C 之猴子吃桃兒問題的解法 猴子吐桃兒

猴子第一天摘了許多個桃子,先吃了所有桃子的一半,後又吃了乙個 第二天又吃了剩下桃子的一半,後又吃了乙個 第十天,剩1個桃子。問 猴子第一天摘了多少個桃子?首先對 猴子吃桃 的過程進行正向推導,設 猴子第一天摘了n個桃子,第n天剩ln個桃子。則 l1 n 2 1 l2 l1 2 1 2 1 l3 l2...

猴子吃桃問題的解法

猴子吃桃問題,猴子第一天摘下n個桃子,當時就吃了一半,還不過癮,就又吃了乙個。第二天又將剩下的桃子吃掉一半,又多吃了乙個。以後每天都吃前一天剩下的一半零乙個。到第10天在想吃的時候就剩乙個桃子了,求第一天共摘下來多少個桃子?public static void main string args sy...

猴子吃桃的問題

面試時被這個題懵了 猴子第一天摘下若干個桃子,當機吃了一半,還不過癮又吃了乙個,以後每天早上吃前天剩下的一半零乙個,第十天早上想吃發現就剩乙個,求第一天共摘了幾個.其實很簡單,從第十天開始觀察,第十天只剩下1個,那麼第九天沒開始吃的時候有2 1 1 個 因為每天要吃當前數量的一半 乙個,所以第十天剩...