蓝桥杯练习——递归(1)
循环与递归
循环与递归有一定的相似性,这是将循环改为递归的关键,就是发现逻辑的相似性
递归最重要的一点,就是找到递归的出口,及返回的条件
构造相似性
有时候相似性并不会太明显,需要去构造
另外,找不到相似性很可能是因为缺少参数
递归在数学上类似递推
递归调用
递归是计算机按照指令完成任务,在递归函数中每次都调用自己,而每次调用的层次是不同的
对于递归调用的形参,每次调用,即每一层次都是不同的,所以在碰到例如将整个数组传进去当形参的情况要额外注意,要设置别的参数指定对数组的哪部分进行操作,否则会造成无法进入下一层的死循环
注意逐层返回时的顺序
例题
1.输出n到m的和
【输入】数据总数N,起点n,终点m
N个数据
【输出】n到m个数据之和
思路
可以想象成第一个数和后面所有数的和,再计算后面数的时候,又可以想成第二个数和后面数之和的和,以此类推,直到最后一个数开始返回
代码
import java.util.Scanner;
public class Sum {
// *[*[*[***********[**]]]]
public static int sum(int a[], int start,int end) {
if(start==end)return end;
int x=sum(a, a[start+1], end);
return a[start]+x;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
int n,m,i,N,c;
N=scanner.nextInt();
n=scanner.nextInt();
m=scanner.nextInt();
int a[]=new int[N+1];
for(i=0;i<N;i++) {
c=scanner.nextInt();
a[i]=c;
}
int s=sum(a, a[n], a[m]);
System.out.println(s);
}
}
2.n个球中选出m个
问题:从n个球中取m个,有几种解决方法?
【输入】n m
【输出】解决方法的数量
思路
假如有一个“幸运球”,那么只有两种情况,那就是取这个球和不取这个球
取这个球:f(n-1,m-1); 因为已经内定了这个球,所以在n-1个球中选m-1个球
不取这个球:f(n-1,m); 已经内定不选这个球,所以在n-1个球中再选m个球
返回条件:1.n小于m,0种取法
2.n==m,1种取法
3.m==0,1种取法
代码
import java.util.Scanner;
public class NforM {
public static int fun(int n,int m) {
if(n<m)return 0;
if(n==m)return 1;
if(m==0)return 1;
return fun(n-1, m-1)+fun(n-1, m);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int m=scanner.nextInt();
int x=fun(n, m);
System.out.println(x);
}
}