迭代、递归替代循环

计算机程序和构造一书里用递归和迭代替代循环,我用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);
}
}

 

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

转载于:https://www.cnblogs.com/lixiangfa/archive/2010/12/16/1907651.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值