2015-03-25 202 views
1

我们的教授要求我们去Distinguish between simple and multiple recursion,我不确定我是否理解正确。区分简单递归和多递归

从我所知,多次递归是当一个方法在他的生命周期中被调用多次(例如斐波那契),但是简单的递归呢?是否仅仅调用一次方法?如果你能举个例子吗?

这是教授。问题 Question

+0

我听到尾和无尾递归的,从来没有听说过的简单和多... – 2015-03-25 06:16:09

+0

它不是在所有愚蠢的,它写得很差,只是尝试添加更多信息 – tbc 2015-03-25 06:31:18

+1

我从来没有听说过它,但显然[维基百科](http://en.wikipedia.org/wiki/Recursion_(computer_science)#Single_recursion_and_multiple_recursion)有。但他们称之为“单一”和“多重”,而不是“简单”和“多重”......实际上,他们确实在文章后面的一点上称之为“简单”递归。 – ajb 2015-03-25 06:31:33

回答

2

单呼叫递归的典型例子是阶乘函数:

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 

对比度与天真斐波那契发生器:

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

维基百科从而定义了这些术语,虽然使用single而非simple,这使得在对比multiple更有意义:

单递归和多个递归

递归只包含单个自引用称为单递归,而包含多个自引用的递归是kno作为多次递归。

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


真的一个很好的使用情况递归因为有大量的在每个呼叫的反复努力。迭代求解好得多在这种情况下(代码是长一点,但工作量最小化):

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 
+0

所以最主要的区别是你调用函数的次数是多少次?例如,Fibonacci call fib(n-1)+ fib(n-2)是多次递归,而阶乘是简单的递归? – BioShock 2015-03-25 06:30:34

+0

@BioShock,基于维基百科,是的,这是主要的区别,但我倾向于称之为递归,“没有任何理智的开发人员甚至会考虑尝试,如果我的爪牙曾经给我买过它,我会非常仔细地考虑当我们下一次做了他们的绩效评估“:-) – paxdiablo 2015-03-25 06:45:01