蓝桥杯练习——递归

蓝桥杯练习——递归(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);
	}
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值