递归算法在程序中不断反复调用自身的方法调用方式。此处的重点是调用自身
递归满足两个条件
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) //填空