递归和迭代(Recursion and Iteration)

在处理一些复杂问题的时候,最常用到的两个方法是递归和叠代,它们直接利用计算机的高速计算能力解决问题。这两种方法都会把一个复杂的问题拆解成很小的,甚至更小的容易解决的步骤,但它们稍有不同。

在两者之中,叠代方法也许更简单一点。叠代方法会把问题分解成一串串行的子步骤,一个接一个的运行。例如,如果需要累加所有小于五的自然数,你需要从一开始(第一步),然后加二(第二步),然后加三(第三步)等等。在每一步中你加入不同的数字(加入的数字与步号相同)。这被称作“迭代遍历程序”(原文为iterating through the problem,译者注)。从一步到另一步的步号(原文为step number,译者注)中只有一部分被真正的改变了,因为你可以从步号中计算出所有其它的信息(比如你要累加的数字)。这就是迭代的关键:通过步号寻找其他的所有信息。迭代运用于语言的经典例子莫过于BASIC或C++中的条件循环(for loop,译者注)语句。

如果说迭代是逐个解决一大堆步骤的话,递归就是把所有步骤堆起来一次性解决。它像是用一个镜子对着另外一个镜子:每一个镜像都是与另外一个镜像差不多,但又完全不同的镜像。

最好用一个例子来解释。你怎么让计算机明白某个人是不是成吉思汗的后代呢?用算法来定义某个人是或者不是成吉思汗后代的方法就象这样:

这个人是成吉思汗的后代当且仅当他/她的父亲是成吉思汗,或者他/她的父亲或母亲是成吉思汗的后代。

等等,我们是不是违反了一个从小学起就耳熟能详的规则——不要用词(可能在这个例子中)来定义它自己呢?好的,在这里我们没有使用完整的循环逻辑,因为我们没有说“一个成吉思汗的后代是成吉思汗的后代”。让我们稍微扩展一下这个定义。

拿吉姆来说。尽管他并不知情,但它是成吉思汗的曾孙。因为吉姆的父亲不是成吉思汗,因此我们必须看看他的父亲是不是成吉思汗的后代......于是,我们又把这个定义再次套用在吉姆的父亲身上,就象我们对吉姆做的那样。吉姆的父亲的父亲(他的祖父)不是成吉思汗,于是我们又去看看他的父亲的父亲的父亲(他的曾祖父)。等等!它的曾祖父正是成吉思汗。那么,这意味着吉姆的祖父是成吉思汗的一个后代,也意味着他的父亲是成吉思汗的后代,也意味着他也是成吉思汗的后代。

你是否注意到,我们越来越深的陷入一个问题,用相同的方法套用直到我们达成某事,这件事情是全新的,那就是“终点”。之后,除非问题已经得到解决,否则我们沿着问题“展开”的次序最终返回问题的起点。这种类似“自复制”的递归技术还导致了一个程序员的笑话:

递归 /冒烟/:see 递归(此处是一个递归逻辑语句,大意是递归递归除非冒烟,原文为Recursion /ree—ker'—zhon/: See Recursion,译者注)

那么,现在大家可以看出递归与迭代两者的不同了。对于迭代来说,每一步都清晰无误的指导下一步,就象是踩着石头过河,但对递归来说,每一步都在一个更小的尺度上复制了自己,最终它们都结合在一起解决问题。完整的理解这两种方法至关重要,因为它们被用于几乎每一种计算机算法中。


 http://www.yeeyan.com/articles/view/14392/3982/dz

转载于:https://www.cnblogs.com/csuwhl/archive/2008/10/10/1308198.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值