遞歸法思想和迭代法思想

迭代法和遞推法,迭代法是很多數學問題的求解算法。遞推法是一種設計算法的常用 思想,沒有固定的算法實現模式 ,通常與其他算法模式配合形成算法實現。

遞歸法思想

一、漢諾塔

先帶大家瞭解一下漢諾塔。

相傳在古印度聖廟中,有一種被稱爲漢諾塔(Hanoi)的遊戲。該遊戲是在一塊銅板裝置上,有三根杆(編號A、B、C),在A杆自下而上、由大到小按順序放置64個金盤。遊戲的目標:把A杆上的金盤全部移到C杆上,並仍保持原有順序疊好。操作規則:每次只能移動一個盤子,並且在移動過程中三根杆上都始終保持大盤在下,小盤在上,操作過程中盤子可以置於A、B、C任一杆上。

 例:先用三個盤子分析一下解題思路——

1、先是給A柱上放三個盤子,標號爲1(頂層)、2(中層)、3(底層),剛好符合從大到小;

2、再把1和2看成一個整體,因此A柱上的盤子就有兩個,(1,2)(頂層)、3(底層);

3、先把(1,2)盤移到B柱上,再把3移到C柱上;

4、這下把(1,2)又分開,就成了1、2,並且都在B柱上,現在又把1移到A柱上;

5、再把2移到C柱上,再把最後一個盤子1移到C柱上,目標達成。

 如果爲64個盤子————先把前面63個看成一個整體,64因此就被分爲兩個部分,接着把63又分爲兩個部分,前62個盤子和63,  以此類推。首先先看3個盤子具體實現步驟如下:

import java.util.Scanner;
/*
漢諾塔————要求:把A杆上的金盤全部移到C杆上,並仍保持原有順序疊好。
                操作規則:每次只能移動一個盤子,並且在移動過程中三根杆上都始終保持大盤在下,
                        小盤在上,操作過程中盤子可以置於A、B、C任一杆上。
在整個過程中具體所要注意的事項是:
                                1、有三根柱子,分別爲:A(起始柱)、B(輔助柱)、C(目標柱)
                                2、A柱上擁有64個盤子,一次是從下到上,從大到小(即大盤在下面,小盤在上面)
                                3、每一次只能移動一個盤子,並且每一根柱上都得是大盤在下,小盤在上
                                4、最終把A柱上的盤子全部移動到C柱上
先用三個盤分析一下思路:
                    再分析思路之前先介紹一下遞歸,什麼是遞歸?
                    遞歸算是一種解題的思想,就是把大問題化小,再把小的問題合併成最終所想要的結果。例:形如下面二叉樹
                                                    9
                                    4                               5
                                1       3                   2               3
                                    1       2           1       1       1       2
                            ·······
                                                                2——(1,1)
                                                    3——(1,2)
                                        4——(1,3)  
                                                    1
                            9——(4,5)              
                                                    2——(1,1)
                                        5——(2,3)               1
                                                    3——(1,2)
                                                                 2——(1,1)
                    先是由大到小一層的一層分,之後又從小返回到大,整個過程就叫做遞歸。
                具體思路:
                        1、先是給A柱上放三個盤子,標號爲1(頂層)、2(中層)、3(底層),剛好符合從大到小;
                        2、再把1和2看成一個整體,因此A柱上的盤子就有兩個,(1,2)(頂層)、3(底層);
                        3、先把(1,2)盤移到B柱上,再把3移到C柱上;
                        4、這下把(1,2)又分開,就成了1、2,並且都在B柱上,現在又把1移到A柱上;
                        5、再把2移到C柱上,再把最後一個盤子1移到C柱上,目標達成。
                如果爲64個盤子,也是運用遞歸的思想————先把前面63個看成一個整體,64因此就被分爲兩個部分,接着把63又分爲兩個部分,前62個盤子和63,
                                                以此類推。
具體實現步驟如下:
 */
class Test02{
    public static void main(String[] args){
        Scanner input=new Scanner(System.in);
        System.out.print("請輸入層數n:");
        int n=input.nextInt();
        System.out.print("請輸入A、B、C:");
        String str1=input.next();
        String str2=input.next();
        String str3=input.next();
        hanNuo(n,str1,str2,str3);
    }
    public static void hanNuo(int n,String str1,String str2,String str3){
        if(n==1){
            System.out.println(str1+"->"+str3);
        }else{
            hanNuo(n-1,str1,str3,str2);
            System.out.println(str1+"->"+str3);
            hanNuo(n-1,str2,str1,str3);
            //System.out.println(str2+"->"+str3);
        }
    }
}

 二、斐波那契數列(遞歸法思想)

import java.util.Scanner;
class Test01{
    public static void main(String[] arga){
        Scanner input=new Scanner(System.in);
        System.out.print("請輸入一個數:");
        int n=input.nextInt();
        for(int i=1;i<=n;i++){
            System.out.print(feiBo(i)+" ");
        }
    }
    public static int feiBo(int n){
        if(n==1||n==2){
            return 1;
        }else{
            return feiBo(n-1)+feiBo(n-2);            
        }
    }
}

 迭代法思想

迭代法也稱輾轉法,是一種不斷用舊值遞推新值的過程。

迭代法三要點——1、確定迭代變量:迭代變量是要求問題的解,根據遞推公式由舊值推出新值,可以是多個,還要設置迭代變量初始值;2、確定迭代遞推關係:根據舊值計算新值的關係或公式;3、確定迭代終止條件。例:

一、斐波那契數列(迭代法思想)

import java.util.Scanner;
class Test05{
/*
用迭代的思想打印斐波那契數列
首先明確斐波那契數列是形如怎樣的數列?
    1   1   2   3   5   8   13  21  ···
該數列具有怎樣的規律:
    從該數列的第三個數值開始,下一個位置上的數值是前兩個數值之和
迭代思想具體體現在哪兒?
    比如:先定義三個變量——a、b、c
        a——用來存放該數列的第一個數值
        b——用來存放該數列的第二個數值
        c——用來存放前兩個數值之和
        這樣才能出現前三個數值,那後面的該怎樣辦?明知道是一個循環,那麼該循環體是什麼?
            已經定義了三個變量,並已經知道三個變量的含義
            因此循環體——在進行第四個數值打印時——將:a=b;b=c;c=a+b;
所以這種思想就是迭代思想——代碼如下:
 */
    public static void main(String[] args){
        Scanner input=new Scanner(System.in);
        System.out.print("請輸入想打印斐波那契數列的個數n:");
        int n=input.nextInt();
        int count=0;//記錄個數
        int a=1;
        System.out.print(a+" ");
        count++;
        int b=1;
        System.out.print(b+" ");
        count++;
        int c;
        while(true){
            c=a+b;//得出斐波那契數列中的數值
            System.out.print(c+" ");
            count++;
            /*
            迭代思想
             */
            a=b;
            b=c;
            /*
            終止條件
             */
            if(count==n){
                break;
            }
        }
    }
}

 謝謝大家·········

                

                                              

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章