遞歸算法在程式中不斷反複調用自身的方法調用方式。此處的重點是調用自身
遞歸滿足兩個條件
1.有反複執行的過程(調用自身)
2.有跳出反複執行過程的條件(遞歸出口)
遞歸算法在軟體競賽中,考察的非常多
我的qq:1527624144 希望和大家交流,一起努力進入總決賽
經典例子:1.求10的階乘
public class A13 {
public static void main(String[] args) {
int s=f(10);
System.out.println(s);
}
public static int f(int n)
{
if(n<=1) return 1;
return f(n-1)*n;
}
}
經典例子:2.斐波那契數組
斐波那契數列,又稱黃金分割數列,指的是這樣一個數列
1、1、2、3、5、8、13、21、34........
這個數列從第三項開始,每一項等于兩項之和
public class A15 {
public static void main(String[] args) {
int s= f(8);
System.out.println(s);
}
//1、1、2、3、5、8、13、21、34
public static int f(int n) //n表示第幾項
{
if(n==0) return 0;
if(n==1) return 1;
return f(n-1)+f(n-2); //表示n的前一項,加上n的前前一項
}
}
經典例子:3.排列問題
//排列問題
// 計算3個A,2個B可以組成多少排列?
//如:AAABB ABAAB
public class A10 {
public static void main(String[] args) {
int s=f(3,2);
System.out.println(s);
}
//有m個a,n個b。組成排列
public static int f(int m,int n)
{
if(m==0||n==0) return 1;
return f(m-1,n)+f(m,n-1); //核心思想
//平地起風雷 思路:有兩種情況:一種是有A的排列組合,一種是沒有A的排列組合
//f(m-1,n) 當組合為第一個A,那麼剩下(m-1)個A元素,n個B元素
//f(m,n-1) 當組合第一個為B,那麼剩下(n-1)個B元素,m個A元素
//然後把他們相加,就是組成了多少排列
}
}
經典例子:4.取球問題
在n個球中,任意取m個(不放回),求有多少種取法?
思路:在n個球中,假設有一個特殊的球X,用劃分:一種是包含X的取法,一種是不包含X的取法
public class A {
public static void main(String[] args) {
int k=f(10,3); //在10個球中,取3個
System.out.println(k);
}
public static int f(int n,int m)
{
if(n<m){ return 0; }//10個球中,總球數 小于 取的球 ,那麼隻有傳回0}
if(n==m){ return 1; } //取的球等去總球數,那麼隻有一種取法
if(m==0){ return 1;} //如果取0個球 ,那麼也隻有一種取法
return f(n-1,m-1)+f(n-1,m);
}
}
以上是關于遞歸算法的經典應用。遞歸算法在藍橋杯中考察的很多
樓主我也報名參加了藍橋杯。看過藍橋直播經驗交流會。
老師說過:1.主要是暴力破解,多層循環的解題模式
2.深入暴力破解,熟練遞歸技巧
有機會沖擊進總決賽。
我是一名大二的學生,非常想能進入總決賽。下面我來說一下真題,希望看到的朋友能和一起交流,一起努力,進入總決賽
————————————————————————————————————————
真題1 (代碼填空)
代碼填空:
楊輝三角形
1 第一行
1 1 第二行
1 2 1 第三行
1 3 3 1 第四行
1 4 6 4 1 第五行
1 5 10 10 5 1 第六行
請填寫下面代碼
//遞歸
//第m行,第n個元素
if(n==0) return n=1
if(m==n) return n=1
return f(m-1,n)+f(m-1,n-1) //填空