關於遞迴和迭代
阿新 • • 發佈:2018-12-08
首先明確遞迴和迭代的概念。
遞迴:程式呼叫自身的程式設計技巧(將大問題化解為相同結構的小問題,從待解問題一直分解到已知答案的最小問題,在逐級返回得 到原解)
使用遞迴的兩個階段:
1)遞推:把複雜的問題的求解推到比原問題簡單一些的問題的求解;
2)迴歸:當獲得最簡單的情況後,逐步返回,依次得到複雜的解.
迭代:從已知式出發,通過遞推式,不斷更新變數到解決問題。
從思想上來說,迭代是人,遞迴是神!迭代是人,遞迴是神
從實現上來說,能用迭代就不用遞迴(遞迴呼叫函式,浪費空間,並且遞迴太深容易造成堆疊的溢位)
下面以劍指offer題為例,給出幾個個人感覺實現比較好的迭代。
題目:一隻青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。
分析:(遞迴方式分析得思路 --->迭代方式寫程式碼)
public class Solution { public int JumpFloorII(int target) { //遞迴的思想快速分析問題得到思路 if (target <= 0) { return -1; } else if (target == 1) { return 1; } else { return 2 * JumpFloorII(target - 1); } } }
f(N) = f(N-1)+ f(N-2)+ f(N-3)+....... +f(1)+1 (1)
= 2^(n-1) (2)
程式碼1:
public class Solution {
public int JumpFloorII(int target) {
if(target == 0) {
return 0;
}
//該方法通過陣列的形式完成1式的累加,並將每一項都儲存起來。
int[] dp = new int[target + 1];
dp[0] = 1;
dp[1] = 1;
for(int i = 2;i <= target;i++) {
dp[i] = 0;
for(int j = 0;j < i;j++) {
dp[i] += dp[j];
}
}
return dp[target];
}
}
程式碼2 :
public class Solution {
public int JumpFloorII(int target) {
//該方法實現2式的累乘
int t =1;
if(target == 0){
return 0;
}else if(target ==1){
return 1;
}else {
for(;target-1>0;target--)
t = 2*t;
}
return t;
}
}