递归简论

1.定义:当一个函数用它自己来定义时就称为是递归(recursive)的。

C 允许函数是递归的。但重要的是要记住,C提供的仅仅是遵循递归思想的一种企图。不是所有的数学递归函数都能有效地(或正确的)由C的递归模拟来实现。如下为一个基本的递归函数:

int F( int X )
{

if (X == 0)                                       //基准情况

return 0;

else

return 2 * F( X-1 )+X*X;  //不断推进

}

                

                      一个基本的递归函数

应该要注意,一般使用递归来计算数值并不是什么好主意!!!

2.当编写递归例程的时候,关键是要牢记递归的四条基本法则:

基准情形。

必须总有某些基准情形,它无需递归就能求出。

不断推进。

对于那些需要递归求解的情形,每一次递归调用都必须要使求解状况朝接近基准情形的方向推进。

设计法则。

假设所有的递归调用都能运行。

对于递归,可以用归纳法来证明,而是用归纳法的基础就是同一问题的所有较小实例均可以假设运行正确。

合成效益法则。

在求解一个问题的同一实例时,切勿在不同的递归调用中做重复性的工作。

 

3.一个比较微妙的错误:

int Bad( unsigned int N )
{

if ( N == 0 )

return 0;

else

return Bad( N/3 + 1 ) + N - 1;

}

                    无终止递归程序

显然,实际上Bad1)究竟是多少,这个定义给不出任何线索。因此,计算机将会反复调用Bad1)以期解出它的值。最后,计算机簿记系统将占满空间,程序崩溃。一般说来,我们会说该函数对一个特殊情形无效,而在其他情形下是正确的。但是在这里其实是计算不出任何一个值得,以为不管是BadN)都会需要调用Bad1)。

所以,对于递归函数,不存在像“特殊情形”这样的情况

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值