【问题标题】:Distinguish between simple and multiple recursion区分简单递归和多重递归
【发布时间】:2015-03-25 14:50:47
【问题描述】:

我们的教授要求我们Distinguish between simple and multiple recursion,我不确定我是否理解正确。

据我所知,多重递归是指一个方法在其生命周期中被多次调用(例如斐波那契),但简单递归又如何呢?是否只调用一次方法?如果是,你能举个例子吗?

这是教授。问题

【问题讨论】:

  • 我听说过尾递归和非尾递归,没听说过简单和多重......
  • 一点都不傻,写的很烂,多加点资料试试
  • 我也从未听说过,但显然Wikipedia 有。但他们称其为“单一”和“多重”,而不是“简单”和“多重”……实际上,他们确实在文章后面的某个地方称其为“简单”递归。

标签: java recursion


【解决方案1】:

单次调用递归的经典例子1是阶乘函数:

f(n) = n * (n-1) * (n-2) ... * 3 * 2 * 1

这将被实现为伪代码:

def factorial (int n, assert n > 0):
    if  n == 1:
        return 1
    return n * factorial (n - 1)          # one call

与朴素的2斐波那契生成器对比:

def fib (int n, assert n >= 0):
    if n < 2:
        return 1
    return fib (n - 1) + fib (n - 2)      # two calls

1 维基百科是这样定义这些术语的,尽管使用single 而不是simple,这与multiple 相比更有意义:

单递归和多递归

只包含一个自引用的递归称为单递归,而包含多个自引用的递归称为多重递归。

单次递归的标准示例包括列表遍历,例如线性搜索或计算阶乘函数,而多重递归的标准示例包括树遍历,例如深度优先搜索或计算斐波那契数列。


2真的不是递归的好用例,因为在每个调用中都有大量的重复工作。在这种情况下,迭代解决方案要好得多(代码稍长但工作量最小化):

def fib (int n, assert n >= 0):
    if n < 2:
        return 1
    n = n - 2

    grandparent = 1
    parent = 1
    me = grandparent + parent
    while n > 0:
        n = n - 1
        grandparent = parent
        parent = me
        me = grandparent + parent
    return me

【讨论】:

  • 所以主要区别是你调用函数的次数对吗?比如斐波那契调用 fib(n-1) + fib(n-2) 是多重递归,而阶乘是简单递归?
  • @BioShock,基于 Wikipedia,是的,这是主要区别,尽管我倾向于称其为良好的递归和“没有理智的开发人员甚至会考虑尝试的递归,如果我的爪牙曾经向我购买过它,当我们接下来进行他们的绩效评估时,我会非常仔细地考虑”:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
相关资源
最近更新 更多