今天去面試,遇到這道題目,有段時間沒寫程式了,溫習一下:
題目是使用遞歸的方法計算1到100的累加,也就是計算1+2+3+4+........+100。大家想必已經聽說過
高斯如何計算這道題的故事,也知道答案是5050。我整理了一下使用遞歸解決的思路,與大家分享。
遞歸的特點就是遞歸函數本身會調用自己,對應到邏輯上就是一段邏輯會使用這段邏輯自身。要使用遞歸的方法解決這道題,就要先用遞歸的思維方式描叙這道題。
我們來看看如何描叙題目本身,最直覺的描叙:“從1開始,後一個數加上前一個數,後一個數是前一個數加一所得,一直加到100”,但這種描叙無法轉化為遞歸的方法。我們試着按遞歸的思路思考這個問題,“做一件事情的步驟又包含這個事情步驟的自身”:
- 最開始一定是“1”+“某個值”
- 如果按老思路,這個“某個值”是“1”再加"1",也就是“2”
- 到這裡,已經完成了一段步驟,并且如果這種思路能形成遞歸,上面的兩步的描叙裡面應該會包含對自身同樣步驟的一段描叙,但我們仔細想想,裡面卻沒有。
- 那我們換個角度思考一下,這個“某個值"也可以是‘2’到‘100’累加的和。到這裡,我們看到了點希望,因為”累加的和“這個詞就是第1、2步在做的事。
- 那麼‘2’到‘100’累加的和又應該是‘2’加上”‘3’到‘100’累加的和“,這裡我們已經看到遞歸的迹象了。
- 再舉一例看看,‘3’到‘100’累加的和又應該是‘3’加上”‘4’到‘100’累加的和“。
- 對于遞歸,還有最重要的一點就是這種嵌套何時終止,不然就無窮無盡了。我們看看最後一步,也就是‘100‘到’100‘累加的和是多少?這次我們不用,也無法遞歸調用了,結果應該直接就是100,是以到這一步,遞歸終止。
對于整個問題,我們可以進一步抽象為用遞歸法求兩個正整數(m,n)累加和的問題,我們還要考慮m<n, m=n, m>n這三種參數傳入方式不同的情況。下面是我寫的C#代碼,以供參考:

using System;

using System.Collections.Generic;

using System.Text;


namespace Accumulation
{
class Program
{
public static int Accum(int m, int n)
//對于接受的參數,要考慮m >n,m=n,m<n三種情況。
if (m < n)
{
return (m + Accum(++m, n)); //如果m<n,傳回“m”加上“m+1到n累加的和”
}
else
{
if (m > n)
{
return (m + Accum(--m, n)); //如果m.n,傳回“m”加上“m-1到n累加的和”
}
else
{
return n; //如果m=n,直接傳回n,這是遞歸的關鍵。
}
}
}
static void Main(string[] args)
Console.WriteLine("The Result of Accumulation from 1 to 100 is:" + Accum(1, 100));
Console.WriteLine("The Result of Accumulation from 1000 to 1 is:" + Accum(1000, 1));
Console.WriteLine("The Result of Accumulation from 80 to 80 is:" + Accum(80, 80));
}
}

