1. 程式人生 > >關於遞迴和迭代

關於遞迴和迭代

首先明確遞迴和迭代的概念。

遞迴:程式呼叫自身的程式設計技巧(將大問題化解為相同結構的小問題,從待解問題一直分解到已知答案的最小問題,在逐級返回得            到原解)

        使用遞迴的兩個階段:

       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;
            }
        }