java 递归函数_浅谈java递归函数
遞歸函數的定義:遞歸函數即自調用函數,在函數體內直接或間接的調用自己,即函數的嵌套是函數本身。
打個生動的比喻:我們可以把” 遞歸 “比喻成 “查字典 “,當你查一個詞,發現這個詞的解釋中某個詞仍然不懂,于是你開始查這第二個詞。可惜,第二個詞里仍然有不懂的詞,于是查第三個詞,這樣查下去,直到有一個詞的解釋是你完全能看懂的,那么遞歸走到了盡頭,然后你開始后退,逐個明白之前查過的每一個詞,最終,你明白了最開始那個詞的意思。(摘自知乎的一個回答)
下面是計算整數i的階乘的遞歸方法。
/*
求整數i的階乘
*/
public static int fac(int i) {
if(i==1) {
return 1;
}
else
return i*fac(i-1);
}
斐波拉契數列:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)
public static int fib(int num) {
if(num == 1 || num == 2) {
return 1;
}else {
return fib(num - 2) + fib(num - 1);
}
}
經典案例:漢諾塔算法
/*
* 某寺廟前有三根柱子A、B、C,開始時A柱上有n個盤子,盤子大小不等,大的在下、小的在上,
* 有一老和尚想把這n個盤子從A柱移到C柱上,但每次只允許移動一個盤子(如上圖所示),
* 且在移動過程序中每根柱子上都始終保持大盤在下、小盤在上。在移動過程中可以借助B柱。
* 要求:正整數n由鍵盤輸入。
*/
public class Hanoi {
public static void main(String[] args) {
Scanner s=new Scanner(system.in );
System.out.println("請輸入n:");
int input=s.nextInt();
hanoi(input,'A','B','C');
}
public static void move(char A,int n,char C) {
System.out.println("將編號為"+n+"的盤子從"+A+"轉移到"+C);
}
public static void hanoi(int n,char A,char B,char C) {
if(n==1) {
move(A,1,C);//如果只有一個盤,則直接將該盤從A轉至C
}
else {
hanoi(n-1,A,C,B);//將編號為n-1的盤子從A通過C轉至B
move(A,n,C);//將A最底層盤轉至C
hanoi(n-1,B,A,C);//將標號為n-1的盤子從B通過A轉至C
}
}
}
總結:
優點:相比非遞歸函數,遞歸函數代碼更簡潔清晰,可讀性更好。
缺點:由于調用遞歸函數需要多次用到系統棧內存,所以空間消耗要比非遞歸代碼要大很多。而且,如果遞歸深度太大,或者由于函數本身邏輯錯誤可能會導致內存溢出,系統崩潰。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的java 递归函数_浅谈java递归函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 笔记打包下载_mysql 5
- 下一篇: java代码编写的文本特征提取_Test