递归原来可以so easy|-连载
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归原来可以so easy|-连载相关的知识,希望对你有一定的参考价值。
一个简单的例子
下面用一个简单的例子来演示递进和回归。
public class Hello {
static int s=1;
static void rd(int n){
System.out.format("%d 递进,n:%d
",s++,n);
if(n==1)
return;
else{
rd(n-1);
System.out.format("%d 回归,n:%d
",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)=1
1天前的桃子数为 (今天的桃子数+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
",day-n+1,num);
return num;
}
public static void main(String[] args) {
int a=peach(day);
}
}
练习题
用递归逆序输出一个包含整型数据的链表。
答案下期给出。
提示 自己实现一个链表类
以上是关于递归原来可以so easy|-连载的主要内容,如果未能解决你的问题,请参考以下文章