天天看點

面試題:使用遞歸的方法計算1到100的累加。

今天去面試,遇到這道題目,有段時間沒寫程式了,溫習一下:

題目是使用遞歸的方法計算1到100的累加,也就是計算1+2+3+4+........+100。大家想必已經聽說過

高斯如何計算這道題的故事

,也知道答案是5050。我整理了一下使用遞歸解決的思路,與大家分享。

遞歸的特點就是遞歸函數本身會調用自己,對應到邏輯上就是一段邏輯會使用這段邏輯自身。要使用遞歸的方法解決這道題,就要先用遞歸的思維方式描叙這道題。

我們來看看如何描叙題目本身,最直覺的描叙:“從1開始,後一個數加上前一個數,後一個數是前一個數加一所得,一直加到100”,但這種描叙無法轉化為遞歸的方法。我們試着按遞歸的思路思考這個問題,“做一件事情的步驟又包含這個事情步驟的自身”:

  1. 最開始一定是“1”+“某個值”
  2. 如果按老思路,這個“某個值”是“1”再加"1",也就是“2”
  3. 到這裡,已經完成了一段步驟,并且如果這種思路能形成遞歸,上面的兩步的描叙裡面應該會包含對自身同樣步驟的一段描叙,但我們仔細想想,裡面卻沒有。
  4. 那我們換個角度思考一下,這個“某個值"也可以是‘2’到‘100’累加的和。到這裡,我們看到了點希望,因為”累加的和“這個詞就是第1、2步在做的事。
  5. 那麼‘2’到‘100’累加的和又應該是‘2’加上”‘3’到‘100’累加的和“,這裡我們已經看到遞歸的迹象了。
  6. 再舉一例看看,‘3’到‘100’累加的和又應該是‘3’加上”‘4’到‘100’累加的和“。
  7. 對于遞歸,還有最重要的一點就是這種嵌套何時終止,不然就無窮無盡了。我們看看最後一步,也就是‘100‘到’100‘累加的和是多少?這次我們不用,也無法遞歸調用了,結果應該直接就是100,是以到這一步,遞歸終止。

對于整個問題,我們可以進一步抽象為用遞歸法求兩個正整數(m,n)累加和的問題,我們還要考慮m<n, m=n, m>n這三種參數傳入方式不同的情況。下面是我寫的C#代碼,以供參考:

面試題:使用遞歸的方法計算1到100的累加。

using System;

面試題:使用遞歸的方法計算1到100的累加。

using System.Collections.Generic;

面試題:使用遞歸的方法計算1到100的累加。

using System.Text;

面試題:使用遞歸的方法計算1到100的累加。
面試題:使用遞歸的方法計算1到100的累加。

namespace Accumulation

面試題:使用遞歸的方法計算1到100的累加。
面試題:使用遞歸的方法計算1到100的累加。
面試題:使用遞歸的方法計算1到100的累加。

{

面試題:使用遞歸的方法計算1到100的累加。

    class Program

面試題:使用遞歸的方法計算1到100的累加。
面試題:使用遞歸的方法計算1到100的累加。
面試題:使用遞歸的方法計算1到100的累加。

        {

面試題:使用遞歸的方法計算1到100的累加。

        public static int Accum(int m, int n)

面試題:使用遞歸的方法計算1到100的累加。
面試題:使用遞歸的方法計算1到100的累加。
面試題:使用遞歸的方法計算1到100的累加。
面試題:使用遞歸的方法計算1到100的累加。

           //對于接受的參數,要考慮m >n,m=n,m<n三種情況。

面試題:使用遞歸的方法計算1到100的累加。

            if (m < n)

面試題:使用遞歸的方法計算1到100的累加。
面試題:使用遞歸的方法計算1到100的累加。
面試題:使用遞歸的方法計算1到100的累加。

            {

面試題:使用遞歸的方法計算1到100的累加。

                 return (m + Accum(++m, n)); //如果m<n,傳回“m”加上“m+1到n累加的和”

面試題:使用遞歸的方法計算1到100的累加。

            }

面試題:使用遞歸的方法計算1到100的累加。

            else

面試題:使用遞歸的方法計算1到100的累加。
面試題:使用遞歸的方法計算1到100的累加。
面試題:使用遞歸的方法計算1到100的累加。

           {

面試題:使用遞歸的方法計算1到100的累加。

                if (m > n)

面試題:使用遞歸的方法計算1到100的累加。
面試題:使用遞歸的方法計算1到100的累加。
面試題:使用遞歸的方法計算1到100的累加。

               {

面試題:使用遞歸的方法計算1到100的累加。

                    return (m + Accum(--m, n)); //如果m.n,傳回“m”加上“m-1到n累加的和”

面試題:使用遞歸的方法計算1到100的累加。

            }

面試題:使用遞歸的方法計算1到100的累加。

                else

面試題:使用遞歸的方法計算1到100的累加。
面試題:使用遞歸的方法計算1到100的累加。
面試題:使用遞歸的方法計算1到100的累加。

                {

面試題:使用遞歸的方法計算1到100的累加。

                    return n; //如果m=n,直接傳回n,這是遞歸的關鍵。

面試題:使用遞歸的方法計算1到100的累加。

                }

面試題:使用遞歸的方法計算1到100的累加。
面試題:使用遞歸的方法計算1到100的累加。

           }

面試題:使用遞歸的方法計算1到100的累加。

        }

面試題:使用遞歸的方法計算1到100的累加。
面試題:使用遞歸的方法計算1到100的累加。

        static void Main(string[] args)

面試題:使用遞歸的方法計算1到100的累加。
面試題:使用遞歸的方法計算1到100的累加。
面試題:使用遞歸的方法計算1到100的累加。
面試題:使用遞歸的方法計算1到100的累加。

            Console.WriteLine("The Result of Accumulation from 1 to 100 is:" + Accum(1, 100));

面試題:使用遞歸的方法計算1到100的累加。

            Console.WriteLine("The Result of Accumulation from 1000 to 1 is:" + Accum(1000, 1));

面試題:使用遞歸的方法計算1到100的累加。

            Console.WriteLine("The Result of Accumulation from 80 to 80 is:" + Accum(80, 80));

面試題:使用遞歸的方法計算1到100的累加。
面試題:使用遞歸的方法計算1到100的累加。
面試題:使用遞歸的方法計算1到100的累加。

    }

面試題:使用遞歸的方法計算1到100的累加。

}

面試題:使用遞歸的方法計算1到100的累加。
面試題:使用遞歸的方法計算1到100的累加。