计算机程序和构造一书里用递归和迭代替代循环,我用C#实现了下,经验证,结果正确。但是对于递归和迭代还是有点未弄清楚,感觉迭代里面其实也用了递归。敬请各位指教。
书中对递归过程是这么描述的:递归过程,论述的是一个语法形式上的事实,说明这个过程的定义中(直接或间接地)引用了该过程本身。而我们说某一计算过程具有某种模式时(比如说线性递归),我们说的是这一计算过程的进展方式,而不是相应过程书写上的语法形式。所以我们可以说某个递归过程将产生一个迭代的计算过程时,可能不好理解,但是这一计算过程确实是迭代的,如下述求两个例子的迭代法,他们其实是递归过程,但是其计算过程确实是迭代的。
一、不用循环,计算x+(x+1)+(x+2)+(x+3)+...+y
递归法:


/// 利用递归求和
/// </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>
/// <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);
程序如下:


{
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);
}
}
由上述实例可以看出,迭代计算过程的状态可以用固定数目的状态变量描述,并且存在一套固定的规则描述计算过程从一个状态到下一状态的转换时,状态变量的更新方式,并且还可能存在描述这一计算过程应该终止的条件。