递归原来可以so easy|-连载(2)

 

hello,各位小伙伴好久不见哦。

还记得咱们上次写过老和尚和小和尚的故事编程么?今天给大家带来连载的第二篇,讲讲递归上的更多实例。

希望各位大宝宝小宝宝们都能快乐学编程鸭!


一个简单的例子

下面用一个简单的例子来演示递进和回归。

public class Hello {
	static int s=1;
    
	static void rd(int n){
		System.out.format("%d 递进,n:%d\n",s++,n);
		if(n==1)
			return;
		else{
			rd(n-1);
			System.out.format("%d 回归,n:%d\n",s++,n);
		}
	}
	public static void main(String[] args) {
		int a=4;
	    rd(a);
	}
}

程序运行结果:

用一个图来描述递进和回归的过程:


斐波那契数列

斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21、34、……,数学上,斐波纳契数列以如下被以递归的方法定义:

F(0)=1,F(1)=1, F(n)=F(n-1)+F(n-2)(n>2,n∈N*)

这个数学公式本身就有递归的,因此,我们可以用递归来实现。

	static int fib(int n){
		int val;
		if(n==0||n==1){
			val=1;
		}
		else{
			val=fib(n-1)+fib(n-2);
		}		
		return val; 
	}
	
	public static void main(String[] args) {
		int a=10;
	    for(int i=0;i<=a;i++){
	    	int f=fib(i);
	    	System.out.print(f+" ");
	    }
	}

最大不超过某个数的所有偶数

如果用循环来做,很直接就可以写出来:

	public static void main(String[] args) {
		System.out.println("请输入不超过某数的所有偶数:");
		Scanner sc=new Scanner(System.in);
		int a=sc.nextInt();
	    for(int i=2;i<=a;i+=2){
	    	System.out.print(i+" ");
	    }
	}

 

如果用递归来做呢?

读者可以先先思考一下怎么写。

...................


public class Hello {
	static int len=0; //偶数个数
	static int[]  all;  //存放所有的偶数 

	 static void evenNum(int n){
	if(n<=0)
		return;
	if(n%2==0){
		all[len]=n; 
		len++;
	}
	evenNum(--n);
}
	
	public static void main(String[] args) {
		System.out.println("请输入不超过某数的所有偶数:");
		Scanner sc=new Scanner(System.in);
		int a=sc.nextInt();
	    int maxNum=a/2+1; //最多有多少个偶数
	    all=new int[maxNum];
	    evenNum(a);
	    for(int i=0;i<len;i++){
	    	System.out.format("%d ",all[i]);
	    }
	}
}

求年龄

问题描述

有5个人坐在一起,问第5个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第3个人,又说比第2人大两岁。问第2个人,说比第1个人大两岁。最后 问第1个人,他说是10岁。请问第5个人多大?

解题

分析一下,可以发现递推公式为: f(n)=2+f(n-1)。

可以用递归程序来解。

	static int age(int n) {
		if (n == 1)
			return 10;
		return 2 + age(--n);
	}

	public static void main(String[] args) {
		int a = age(5);
		System.out.println(a);
	}

猴子吃桃子

问题描述

猴子第一天摘下N个桃子,当时就吃了一半,还不过瘾,就又多吃了一个。第二天又将剩下的桃子吃掉一半,又多吃了一个。以后每天都吃前一天剩下的一半零一个。到第10天在想吃的时候就剩一个桃子了,问第一天共摘下来多少个桃子?并反向打印每天所剩桃子数。

解题

这个题目,要倒过来算:

今天有1个桃子,记为 f(0)=11天前的桃子数为 (今天的桃子数+1)2:f(1)= (f(0)+1)2 2天前的桃子数为 (1天前的桃子数+1)2:f(2)= (f(1)+1)2 …10天前的桃子数为 (9天前的桃子数+1)2:f(10)= (f(9)+1)2得到递推公式为:f(n)= (1+f(n-1))*2

通过这个公式,可以计算任意天前的桃子数。

public class Hello {
	static int day=10;
	
	static int peach(int n){
		int num;
		if(n==1){
			num=1;
		}else{
			num=(1+peach(n-1))*2;
		}
		System.out.format("第%2d天,桃子数:%d \n",day-n+1,num);
		return num;
	}
	
	public static void main(String[] args) {
		int a=peach(day);
	}
}

练习题

用递归逆序输出一个包含整型数据的链表。

答案下期给出。

【提示】自己实现一个链表类


源码、更多资深讲师相关课程资料、学习笔记请入群后向管理员免费获取,更有专业知识答疑解惑。入群即送价值499元在线课程一份。

QQ群号:560819979

敲门砖(验证信息):高山流水

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值