1.在定義乙個過程或函式時,出現呼叫自己的成分,稱為遞迴;
2.遞迴一般執行時效率都很低,耗時很長;
3.可以將複雜的問題很容易的表示出來,比如漢諾塔的問題,能很好地展現遞迴的作用;
4.遞迴在實際問題中都需要乙個出口,不能無限進行下去。
1.如果乙個函式中所有遞迴形式的呼叫都出現在函式的末尾,則稱這個遞迴函式是尾遞迴;
2.遞迴呼叫是整個函式體中最後執行的語句且它的返回值不屬於表示式的一部分;
3.尾遞迴只需要保留最後乙個函式堆疊,不需要儲存很多中間函式的堆疊
特點:在回歸過程中不用做任何操作,這個特性很重要,因為大多數現代的編譯器會利用這種特點自動生成優化的**。遞迴:
double fact
(int n)
return n *
fact
(n -1)
;}
若n=5,執行次序如下:
fact(5);
5* fact(4);
5* (4* fact(3));
5* (4* (3* fact(2)));
5* (4* (3* (2* fact(1))));
5* (4* (3* (2* 1)));
120
可見這種方法空間複雜度為o(n),無論是時間上還是空間上的消耗都很大,極易出現爆棧的情況,進而出現了尾遞迴的應用尾遞迴:
double fact
(int n, double total)
return
fact
(n -
1, n * total)
;}
若n=5,執行次序如下:
fact(5,1);
fact(4,5);
fact(3,20);
fact(2,60);
fact(1,120);
120
由於尾遞迴只需要保留最後乙個函式堆疊,不需要儲存很多中間函式的堆疊,所以空間複雜度為o(1),因此大大提高了執行效率尾遞迴的應用在時間上沒有太大的變化,但空間上的優化很大,有效的避免了爆棧現象,是解題過程中的一種很好的方法。
遞迴與尾遞迴
1 遞迴 關於遞迴的概念,我們都不陌生。簡單的來說遞迴就是乙個函式直接或間接地呼叫自身,是為直接或間接遞迴。一般來說,遞迴需要有邊界條件 遞迴前進段和遞迴返回段。當邊界條件不滿足時,遞迴前進 當邊界條件滿足時,遞迴返回。用遞迴需要注意以下兩點 1 遞迴就是在過程或函式裡呼叫自身。2 在使用遞迴策略時...
遞迴與尾遞迴
1 遞迴 簡單的來說遞迴就是乙個函式直接或間接地呼叫自身,是為直接或間接遞迴。一般來說,遞迴需要有邊界條件 遞迴前進段和遞迴返回段。當邊界條件不滿足時,遞迴前進 當邊界條件滿足時,遞迴返回。用遞迴需要注意以下兩點 1 遞迴就是在過程或函式裡呼叫自身。2 在使用遞迴策略時,必須有乙個明確的遞迴結束條件...
遞迴與尾遞迴
前言 今天上網看帖子的時候,看到關於尾遞迴的應用 大腦中感覺這個詞好像在 見過,但是又想不起來具體是怎麼回事。如是乎,在網上搜了一下,頓時豁然開朗,知道尾遞迴是怎麼回事了。下面就遞迴與尾遞迴進行總結,以方便日後在工作中使用。1 遞迴 關於遞迴的概念,我們都不陌生。簡單的來說遞迴就是乙個函式直接或間接...