亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

遞歸求和方法

遞歸求和方法

肥皂起泡泡 2021-07-07 05:06:01
我不明白以下代碼的結果如何6,當調用為時sum(3)。有人可以解釋一下嗎?public int sum(int number) {    if (number == 1) {        return number;    } else {        return number + sum(number - 1);    }}
查看完整描述

3 回答

?
慕勒3428872

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;

    }

我鼓勵您使用您最喜歡的調試器逐步完成此過程,以說服自己就是這種情況。

* 警告:實際上,我們實際上不能使用它來生成任何自然數的總和,因為我們最終會遇到以下幾個問題之一:

  1. 有無數個自然數,但只有有限的內存量。(請注意,無窮本身不是自然數,甚至也不是實數,而是超實數)。

  2. 最終,計算所需的時間長度將超過正常人的壽命。例如,計算 10^10 的總和將花費近 167 小時(即使您每秒執行一百萬次操作)。以每秒 1000000 次操作計算 10^20 的總和將需要 190,258,751(即超過 1.9年)。

  3. 一個數字int能容納多大是有嚴格限制的。

然而,我們仍然有解決方案的數學規范:sum(10^20) = 10^20 + sum(10^20 - 1)- 我們只是沒有時間計算它。


查看完整回答
反對 回復 2021-07-07
?
呼如林

TA貢獻1798條經驗 獲得超3個贊

這叫做遞歸


如果您將調試此代碼,您將看到如下內容:


step0: sum(3)

step1: 3 + sum(2)

step2: 3 + 2 + sum(1)

step3: 3 + 2 + 1


查看完整回答
反對 回復 2021-07-07
  • 3 回答
  • 0 關注
  • 203 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號