一级棒(Eachfun)
递归
发表时间:2006-08-02 05:07:32 关键词:C++,MFC,VC,Primer,编程,教程,读书

  引用:直接或间接调用自己的函数称为递归函数。
  引用:递归函数必须定义一个终止条件,否则函数将永远递归下去,这意味着函数会一直调用自身直到程序耗尽。
  初识递归的时候,的确有些不容易搞明白。记得当时的教科书为此画一个图,用一组箭头来表示要计算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);
}
  程序二的写法与程序一没有区别,但可以告诉自己递归必须有终止条件。防止一不小心就写了个“永远”。
  似乎绝大多数递归函数都可以用循环来解决。这两种方法迁就了不同的对象:循环用少量的计算机资源、大量的人力来解决问题,递归则用大量的计算机资源、少量的人力来解决问题。所以,在计算机速度和存储量都不大的年代,曾有人反对递归。
  汉诺塔问题据说是只有用递归才可以解决的问题,其实只有要求解汉诺塔的移动过程才必须用递归,如果只要求解移动次数,那么用循环也不成问题。

本站特约顾问律师常州东晟律师事务所朱立律师(电话13915029670,QQ646146109)提醒您:
本站文章皆为作者原创,其它媒体(包括但不限于报刊、杂志、网站、电视、电台)未经作者书面许可严禁转载(或部分摘录)!
相关评论
  • 晕,我忘了相乘了,哈哈。
    作者:偷猫 时间:2006-08-03 19:17:46
  • 阶乘的函数写错了.
    int factorial(int val)
    {
      if (val > 1)
        return val* factorial(val-1);
      return 1;
    }
    作者:walkman 时间:2006-08-03 14:57:18
1
发表评论
称呼:
QQ:
邮箱:
链接:
内容:
搜索: 百度搜索 Google搜索
Copyright©2000 - 2008 Eachfun.Com, All Rights Reserved 一级棒网络
苏ICP备05080156号
一级棒建站系统 http://www.eachfun.com 一级棒版权所有,未经许可不得商用!