斐波那契数列
{1,1,2,3,5,8,13.......}
代码实现如下:
package com.itazhang.demo1;
public class FibonacciTest {
public static void main(String[] args) {
int sum = 0;
int[] arr = new int[12];
arr[0] = 1;
arr[1] = 1;
for (int i = 2; i < 12; i++) {
sum = arr[i-1] + arr[i-2];
arr[i] = sum;
}
System.out.println(sum);
//-----------递归写法----------
System.out.println(fb(12));
}
/*
f12 = f11 + f10
f11 = f10 +f9
f10 = f9 + f8
.......
f3 = f2 + f1
f2 = 1
f1 = 1
*/
public static int fb(int a){
if(a == 1 || a == 2){
return 1;
}
return fb(a-1) + fb(a-2);
}
}
猴子吃桃
猴子每天吃前一天吃的桃的一半数量加一个桃,例如第10天桃子只剩1个,那么第9天就应该吃了(1+1)*2个桃
具体规律如下:
day10->1 day9->(1+1)*2 ((day10)+1)*2 day8->((1+1)*2+1)*2 ((day9)+1)*2 ...
而他的递归结束条件就是第10天的时候,只剩了一个桃,问第一天吃了几个桃
具体代码实现如下:
package com.itazhang.demo1;
public class Test5 {
public static void main(String[] args) {
System.out.println(eatCount(1));
}
/*
day10->1
day9->(1+1)*2 ((day10)+1)*2
day8->((1+1)*2+1)*2 ((day9)+1)*2
...
*/
public static int eatCount(int day){
if(day == 10){
return 1;
}
//这里的(day+1)表示的是后一天的天数,例如第一天的day+1就是第二天,而第二天吃的个数用递归eatcount(2)得到
//再将第二天的个数也就是(eatcount(2)+1)*2,最后得到的就是第一天的个数
return (eatCount(day+1)+1)*2;
}
}
爬楼梯递归问题
小明爬楼梯,一次爬1级,一次爬2级,一次爬3级,问爬20级楼梯有多少种爬法。
//小明爬楼梯,一次爬1级,一次爬2级,一次爬3级,问爬20级楼梯有多少种爬法 //因为可以一次爬1,2,3级楼梯,所以在第16级时,他后面无论怎么爬,都是会与17级,18级,19级爬楼梯时的方法重复 //换句话说,在爬到16级楼梯时,他后面必须得爬后面的17,18,19级楼梯,所以爬到16级楼梯的时候,后面的爬楼梯方法应该被包含
package com.itazhang.demo1;
public class Test6 {
public static void main(String[] args) {
//小明爬楼梯,一次爬1级,一次爬2级,一次爬3级,问爬20级楼梯有多少种爬法
//因为可以一次爬1,2,3级楼梯,所以在第16级时,他后面无论怎么爬,都是会与17级,18级,19级爬楼梯时重复
//换句话说,在爬到16级楼梯时,他后面必须得爬后面的17,18,19级楼梯,所以爬到16级楼梯的时候,后面的爬楼梯方法应该被包含
System.out.println(up(20));
}
//这里的方法中的num表示有几级台阶需要爬,而方法的返回值就是爬楼梯的爬法数量
public static int up(int num){
if(num == 1){
return 1;
}
if(num == 2){
return 2;
}
if(num == 3){
return 4;//因为在还有三极楼梯时会有4种爬楼梯方法
}
return up(num-1) + up(num-2) + up(num-3);
}
}
递归使用的时候要找到两个必要条件
1、递归结束的临界条件
2、递归时所使用的规律
总的来说递归还是比较难理解的,以后多看这些记录的算法题能方便理解递归的用法