首先我們說說什麼是遞迴。
程式呼叫自身的程式設計技巧稱為遞迴( recursion)。遞迴做為一種演算法在
程式語言
中廣泛應用。 乙個過程或
函式在其定義或說明中有直接或間接呼叫自身的一種方法,它通常把乙個大型複雜的問題層層轉化為乙個與原問題相似的規模較小的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的**量。遞迴的能力在於用有限的
語句來定義物件的
無限集合
。一般來說,遞迴需要有邊界條件、遞迴前進段和遞迴返回段。當邊界條件不滿足時,遞迴前進;當邊界條件滿足時,遞迴返回。
1.邊界條件:沒有邊界的遞迴想來大家知道是什麼後果了,無限遞迴。就陷入死迴圈當中了,所以當我們使用遞迴是切記不要忘了判斷邊界。當我們遞迴陷入死迴圈首先也應該檢查邊界條件的邏輯是否有錯誤(這個筆者深有體會,被擺了好多次道)。
2遞迴前進段:也就是遞迴主主體,如何讓遞迴深入的遞迴下去,這個就不需要多加解釋了吧。
3.遞迴返回:這個就是我們需要遞迴做的事情,返回我們所需要的資料處理。
牢記這3個要點,寫遞迴演算法是就能大大減少錯誤了。
下面給出乙個常見例子。跳台階問題
* 跳台階問題:兩種上台階方式
* 1.一次上乙個台階,
* 2一次上兩個台階,
* 問:登上n階台階共有多少種方式
思路:登上n階台階問題可以轉換成登上n-2個台階方式和登上n-1個台階方式之和的問題
即有公式 f(n)=f(n-1)+f(n-2) (n>2)
f(1)=1;
f(2)=2;
使用上面的遞迴思想結合公式很容易寫出程式。
那麼我們再來看看跳台階公升級版的問題。
*跳台階公升級版,
* 跳台階有n中方式
* 1.一次跳乙個
* 2.一次跳兩個
* 。。。。
* n.一次跳n個
* 問n個台階共有多少種方式
與上面跳台階不同的是這次跳台階的方式變得多了起來,並且隨著台階數,方式不斷增加,
然而解決思想並沒有改變
思路:登上n階台階問題可以轉換成登上n-2個台階方式加上登上n-1個台階加上登上n-3個台階....加到登上1個台階方式之和再加上一次登上總台階和的問題
即有公式 f(n)=f(n-1)+f(n-2) +f(n-3)+......+f(3)+f(2)+(1)+1
下面給出這兩個問題**
<?php
/* * 跳台階問題:兩種上台階方式
* 1.一次上乙個台階,
* 2一次上兩個台階,
* 問:登上n階台階共有多少種方式
*
*/function jump($num)
if($num==2||$num==1)
}function jump1($num)
$count=2;
$pre=1;
for($i=3;$i<=$num;$i++)
return $count;
}/*跳台階公升級版,
* 跳台階有n中方式
* 1.一次跳乙個
* 2.一次跳兩個
* 。。。。
* n.一次跳n個
* 問n個台階共有多少種方式
*/function jumpup($num)
return $count+1;
}//echo jump(6);
//echo jump1(6);
echo jumpup(5);
遞迴之跳台階問題
分析 這道題最近經常出現,包括microstrategy等比較重視演算法的公司都曾先後選用過個這道題作為面試題或者筆試題。首先我們考慮最簡單的情況。如果只有1級台階,那顯然只有一種跳法。如果有2級台階,那就有兩種跳的方法了 一種是分兩次跳,每次跳1級 另外一種就是一次跳2級。現在我們再來討論一般情況...
跳台階問題
題目 乙個台階總共有n級,如果一次可以跳1級,也可以跳2級。求總共有多少總跳法,並分析演算法的時間複雜度。分析 這道題最近經常出現,包括microstrategy等比較重視演算法的公司都曾先後選用過個這道題作為面試題或者筆試題。首先我們考慮最簡單的情況。如果只有1級台階,那顯然只有一種跳法。如果有2...
跳台階問題
有n個階梯,青蛙一次可以跳乙個或者兩個,求總共有多少種跳法可以到達頂端?思路 如果只有一階,那麼只有一種跳法 如果有2階,那麼有2中跳法 跳1階再跳1階,一次跳2階 那麼如果有n階呢?假設對於n階的階梯,我們有f n 中跳法 那麼n階時,我們考慮如果第一次跳共有兩種選擇 第一次跳了1階,剩下n 1階...