2015-03-25 171 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