電腦程式和構造一書裡用遞迴和迭代替代迴圈,我用C#實現了下,經驗證,結果正確。但是對於遞迴和迭代還是有點未弄清楚,感覺迭代裡面其實也用了遞迴。敬請各位指教。
書中對遞迴過程是這麼描述的:遞迴過程,論述的是一個文法形式上的事實,說明這個過程的定義中(直接或間接地)引用了該過程本身。而我們說某一計算過程具有某種模式時(比如說線性遞迴),我們說的是這一計算過程的進展方式,而不是相應過程書寫上的文法形式。所以我們可以說某個遞迴過程將產生一個迭代的計算過程時,可能不好理解,但是這一計算過程確實是迭代的,如下述求兩個例子的迭代法,他們其實是遞迴過程,但是其計算過程確實是迭代的。
一、不用迴圈,計算x+(x+1)+(x+2)+(x+3)+...+y
遞迴法:
代碼
/// <summary>
/// 利用遞迴求和
/// </summary>
/// <param name="x">起始值</param>
/// <param name="y">截止值</param>
/// <returns>終值</returns>
static int SumDigui(int x,int y)
{
if (x > y)
return 0;
else
{
return y + SumDigui(x, y - 1);
}
}
迭代法(遞迴過程,但是採用的是迭代的計算過程):
代碼
/// <summary>
/// 迭代求和
/// </summary>
/// <param name="x">起始值</param>
/// <param name="y">截止值</param>
/// <returns>和</returns>
static int SumDiedai(int x, int y)
{
return diedaiSum(x, x + 1, y);
}
/// <summary>
/// 迭代求和
/// </summary>
/// <param name="product">結果=product+next</param>
/// <param name="next"></param>
/// <param name="maxcount"></param>
/// <returns></returns>
static int diedaiSum(int product, int next, int maxcount)
{
if (next > maxcount)
{
return product;
}
else
{
return diedaiSum(product + next, next + 1, maxcount);
}
}
二、不用迴圈,計算n的階乘
遞迴法:
代碼
//遞迴求階乘
static int Jidigui(int n)
{
if (n == 1)
return 1;
else
{
return n * Jidigui(n - 1);
}
}
迭代法(遞迴過程,但是採用的是迭代的計算過程):
代碼
//迭代求階乘
static int Jidiedai(int n)
{
return factiter(1, 1, n);
}
/// <summary>
/// 迭代計算
/// </summary>
/// <param name="product">結果=procduct*couter,初始值為1</param>
/// <param name="couter">計數器counter初始值為1</param>
/// <param name="maxcount">n</param>,
/// <returns></returns>
static int factiter(int product, int couter, int maxcount)
{
if (couter > maxcount)
return product;
else
{
return factiter(product * couter, couter + 1, maxcount);
}
}
三、分別用遞迴和迭代求斐波那契數0,1,1,2,3,5,8,13,21.........................
遞迴描述:
如果n=0,Fib(n)=0;
如果n=1,Fib(n)=1;
否則Fib(n)=Fib(n-1)+Fib(n-2);
程式如下:
代碼
static int Fib(int n)
{
if (n == 0)
{ return 0; }
if (n == 1)
{ return 1; }
else
{
return Fib(n - 1) + Fib(n - 2);
}
}
迭代描述:
設定一個基本整數a和一個基本整數b,初始化時a = Fib(1),b = Fib(0);
然後重複運用下列變換規則:
a = a + b;
b = a;
重複運用上述變換規則n此後,a = Fib(n+1);b = Fib(n)。
此時b就是我們要求的值:
代碼如下:
代碼
//迭代法求斐波那契數
static int FibDiedai(int n)
{
return FibIter(1, 0, n);
}
static int FibIter(int a, int b, int count)
{
if (count == 0)
return b;
else
{
return FibIter(a + b, a, count - 1);
}
}
由上述執行個體可以看出,迭代計算過程的狀態可以用固定數目的狀態變數描述,並且存在一套固定的規則描述計算過程從一個狀態到下一狀態的轉換時,狀態變數的更新方式,並且還可能存在描述這一計算過程應該終止的條件。