迭代法和遞推法,迭代法是很多數學問題的求解算法。遞推法是一種設計算法的常用 思想,沒有固定的算法實現模式 ,通常與其他算法模式配合形成算法實現。
遞歸法思想
一、漢諾塔
先帶大家瞭解一下漢諾塔。
相傳在古印度聖廟中,有一種被稱爲漢諾塔(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;
}
}
}
}
謝謝大家·········