為了讓非資工的同仁理解何謂遞迴
為了讓非資工的同仁理解何謂遞迴,特地撰寫此範例程式練功用。是一個簡單又可以理解其他議題的好範例。
- 使用三個變數的好處是,簡潔節省執行時間。
- 使用遞迴部分,讓人理解遞迴在執行時會多出其他系統資源成本。
- 順便知道,原來C# int 會出現溢位(overflow)。可以用來探討基本基料型態的數值範圍。
- 微軟官方文件之整數數數值型別 (C# 參考)
// For 迴圈版本
static void Main(string[] args)
{
int loopCnt = 100;
ulong bef2 = 0; // 前二個數
ulong bef1 = 1; // 前一個數
ulong currentNumber = 0; // 目前的數
//迴圈版本
Console.WriteLine($"{bef2}");
Console.WriteLine($"{bef1}");
for (int i = 3; i <= loopCnt; i++)
{
currentNumber = bef2 + bef1; //算出目前的數
bef2 = bef1; // 將前一個數移至前二個數
bef1 = currentNumber; // 將目前的數移至前一個數
Console.WriteLine($"{currentNumber}");
}
//遞迴版本呼叫
for (int idx = 0 ; idx <= 100; idx++)
Console.WriteLine($"{idx}-{Fibonacci(idx)}");
}
/// <summary>
/// 費式級數到 12200160415121876738 overflow,其它程式語言應該不會
/// </summary>
/// <param name="num"></param>
/// <returns></returns>
private static int Fibonacci(int num)
{
if (num == 0)
return 0;
if (num <= 2)
return 1;
return Fib(num - 1) + Fib(num - 2);
}