3 回答

TA貢獻1848條經驗 獲得超6個贊
這樣想:如果我告訴你sum
以前的number
,你能告訴我sum
現在的number
嗎?如果我告訴你sum(4) = 10
,那是sum(5)
什么?嗯,很明顯sum(5) = 5 + sum(4) = 5 + 10 = 15
。
這是另一個挑戰:基于此,您能計算出sum(7)
嗎?好吧,很明顯sum(7) = 7 + sum(6) = 7 + 6 + sum(5) = 7 + 6 + 15 = 28
- 我們已經“知道”了 的值這一事實sum(5)
意味著我們可以直接將其替換(至少為了我們手工計算的目的)。
你知道了:如果我在序列中的某個地方給你一個任意數字,你就會知道序列中后面的值是如何與它相關的。然后,您可以使用它來生成更多值。碰巧的是,最初寫這個的人給了我們序列中的第一個值:sum(1) = 1
。這(至少在理論上)允許我們為任何自然數生成總和。*(見下面的警告)。
順便說一下,下面的for
循環基本上是等價的:
public static int forSum(int number)
{
int ret = 0;
for (int i = number; i >= 1; i--)
{
ret += i;
}
return ret;
}
我鼓勵您使用您最喜歡的調試器逐步完成此過程,以說服自己就是這種情況。
*
警告:實際上,我們實際上不能使用它來生成任何自然數的總和,因為我們最終會遇到以下幾個問題之一:
有無數個自然數,但只有有限的內存量。(請注意,無窮本身不是自然數,甚至也不是實數,而是超實數)。
最終,計算所需的時間長度將超過正常人的壽命。例如,計算 10^10 的總和將花費近 167 小時(即使您每秒執行一百萬次操作)。以每秒 1000000 次操作計算 10^20 的總和將需要 190,258,751年(即超過 1.9億年)。
一個數字
int
能容納多大是有嚴格限制的。
然而,我們仍然有解決方案的數學規范:sum(10^20) = 10^20 + sum(10^20 - 1)
- 我們只是沒有時間計算它。

TA貢獻1798條經驗 獲得超3個贊
這叫做遞歸
如果您將調試此代碼,您將看到如下內容:
step0: sum(3)
step1: 3 + sum(2)
step2: 3 + 2 + sum(1)
step3: 3 + 2 + 1
添加回答
舉報