区分简单递归和多次递归

时间:2015-03-25 06:11:29

标签: java recursion

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

据我所知,多次递归是指一个方法在其生命周期中被调用多次(例如Fibonacci),但是一个简单的递归呢?是否只调用一次方法?如果是,你可以举个例子吗?

这是教授。题 Question

1 个答案:

答案 0 :(得分:3)

单调用递归 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 Fibonacci发生器形成对比:

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