1、当一个函数用它自己来定义时就称为递归的。C允许函数是递归的。但重要的是:C提供的仅仅是遵循递归思想的一种企图。不是所有的数学递归函数都能有效地(或正确地)由C的递归模拟来实现。
int Bad(unsigned int N) { if (N == 0) { return 0; } else { return Bad(N / 3 + 1) + N - 1; } }
在以上例子中,计算机将会反复调用Bad(1)以期解出它的值。最后计算机薄记系统将占满空间,程序崩溃。
注意:实际上,递归调用在处理上与其他的调用没有什么不同。跟踪挂起的函数调用(这些调用已经开始但是正等待着递归调用来完成)以及它们中变量的记录工作都是由计算机自动完成的。
2、递归的四条基本法则。
(1)基准情形。
你必须总要有某些基准的情形,它们不用递归就能求解。
(2)不断推进。
对于那些需要递归求解的情形,递归调用必须总能够朝着产生基准情形的方向推进。
(3)设计法则。
假设所有的递归调用都能运行。这是一条重要法则,因为它意味着,当设计递归程序时一般没有必要知道开销管理的细节,不必视图追踪大量的递归调用,计算机能够算出复杂的细节。
(4)合成效益法则。
在求解一个问题的同一实例时,切勿在不同的递归调用中做重复性工作。
例如:使用递归来计算诸如斐波那契数列之类简单数学函数的值的想法一般来说不是一个好主意。
时间: 2024-10-31 18:58:29