引用:直接或间接调用自己的函数称为递归函数。
引用:递归函数必须定义一个终止条件,否则函数将永远递归下去,这意味着函数会一直调用自身直到程序耗尽。
初识递归的时候,的确有些不容易搞明白。记得当时的教科书为此画一个图,用一组箭头来表示要计算A必须先计算B、要计算B又要先计算C、……,用另一组箭头表示算好了C就可以算B、算好了B就可以算A。……实例程序与一个图结合,如此摆事实讲道理,要说明递归自然稍容易些。
要写递归函数就得领悟递归的妙用,要写没有错误的递归函数则要领悟其数学原理。我倒是觉得这样的函数与“数学归纳法”有些相通之处。不同的是,数学归纳法总是先求边界条件,再去往无穷方向归纳。而递归是从无穷方向向边界计算的。函数如何执行,与我们如何写没有必然的关系,于是,我们在写程序的时候也可以先写边界条件。这样做可以在程序开头先把可能的问题给排除掉。“永远递归下去”的可能性自然被降低。比如求阶乘的函数:
//程序一、书上的例子
int factorial(int val)
{
if (val > 1)
return factorial(val-1);
return 1;
}
//程序二
int factorial2(int val)
{
if (val <= 1)
return 1;
return factorial2(val-1);
}
程序二的写法与程序一没有区别,但可以告诉自己递归必须有终止条件。防止一不小心就写了个“永远”。
似乎绝大多数递归函数都可以用循环来解决。这两种方法迁就了不同的对象:循环用少量的计算机资源、大量的人力来解决问题,递归则用大量的计算机资源、少量的人力来解决问题。所以,在计算机速度和存储量都不大的年代,曾有人反对递归。
汉诺塔问题据说是只有用递归才可以解决的问题,其实只有要求解汉诺塔的移动过程才必须用递归,如果只要求解移动次数,那么用循环也不成问题。
本站文章皆为作者原创,其它媒体(包括但不限于报刊、杂志、网站、电视、电台)未经作者书面许可严禁转载(或部分摘录)!

偷猫
未填
未填
未填
时间:2006-08-03 19:17:46