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; } |
无终止递归程序 |
显然,实际上Bad(1)究竟是多少,这个定义给不出任何线索。因此,计算机将会反复调用Bad(1)以期解出它的值。最后,计算机簿记系统将占满空间,程序崩溃。一般说来,我们会说该函数对一个特殊情形无效,而在其他情形下是正确的。但是在这里其实是计算不出任何一个值得,以为不管是Bad(N)都会需要调用Bad(1)。
所以,对于递归函数,不存在像“特殊情形”这样的情况。