X Tutup
Skip to content

Commit ef3fb98

Browse files
committed
汉诺塔和斐波那契数量实现源码
1 parent 73ce651 commit ef3fb98

File tree

2 files changed

+163
-0
lines changed

2 files changed

+163
-0
lines changed
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
package com.zejian.structures.recursion;
2+
3+
import java.math.BigInteger;
4+
5+
/**
6+
* Created by zejian on 2016/12/11.
7+
* Blog : http://blog.csdn.net/javazejian [原文地址,请尊重原创]
8+
* 斐波那契数列的实现
9+
*/
10+
public class Fibonacci {
11+
12+
/**
13+
* 斐波那契数列的实现
14+
* 0,1,1,2,3,5,8,13,21......
15+
* @param day
16+
*/
17+
public long fibonacci(int day){
18+
19+
if(day==0){ //F(0)=0
20+
return 0;
21+
}else if (day==1||day==2){//F(1)=1
22+
return 1;
23+
}else {
24+
return fibonacci(day-1)+fibonacci(day-2); //F(n)=F(n-1)+F(n-2)
25+
}
26+
}
27+
28+
/**
29+
* 更为简洁的写法
30+
* @param day
31+
* @return
32+
*/
33+
public long fib(int day) {
34+
return day== 0 ? 0 : (day== 1 || day==2 ? 1 : fib(day - 1) + fib(day - 2));
35+
}
36+
37+
// //1,2,3,5,8,13,21......
38+
// BigInteger fib_i(int a, int b , int n)
39+
// {
40+
// if (n==3){
41+
// return BigInteger.valueOf(a).add(BigInteger.valueOf(b));
42+
// }else {
43+
// return fib_i(b ,a+b, n-1);
44+
// }
45+
// }
46+
47+
//BigInteger可以防止数据异常
48+
//BigInteger 任意大的整数,原则上是,只要你的计算机的内存足够大,可以有无限位的
49+
// 递推实现方式(迭代的方式效率高,时间复杂度O(n))
50+
public BigInteger fibonacciN(int n){
51+
if (n == 1) {
52+
return new BigInteger("0");
53+
}
54+
//f(0)=0;
55+
BigInteger n1 = new BigInteger("0");
56+
//f(1)=1;
57+
BigInteger n2 = new BigInteger("1");
58+
//记录最终值f(n)
59+
BigInteger sn = new BigInteger("0");
60+
for (int i = 0; i < n - 1; i++) {
61+
sn = n1.add(n2);//相加
62+
n1 = n2;
63+
n2 = sn;
64+
}
65+
return sn;
66+
}
67+
68+
// 与上述相同的递推实现方式 ,使用long返回值,当n过大会造成数据溢出,计算结果可能是一个未知的负数,因此建议使用BigInteger
69+
public static long fibonacciNormal(int n){
70+
if(n <= 2){
71+
return 1;
72+
}
73+
long n1 = 1, n2 = 1, sn = 0;
74+
for(int i = 0; i < n - 2; i ++){
75+
sn = n1 + n2;
76+
n1 = n2;
77+
n2 = sn;
78+
}
79+
return sn;
80+
}
81+
82+
//测试
83+
public static void main(String[] args){
84+
Fibonacci fibonacci=new Fibonacci();
85+
long now =System.currentTimeMillis();
86+
// System.out.println("第11天动物数量为:"+ fibonacci.fib_i(1,1,50));
87+
// System.out.println("第11天动物数量为:"+ fibonacci.fib(50));//12586269025
88+
System.out.println("第11天动物数量为:"+ fibonacci.fibonacciNormal(100));//12586269025
89+
// System.out.println("第11天动物数量为:"+ fibonacci.fibonacci(10));
90+
System.out.println("执行第500天的时间为:"+(System.currentTimeMillis()-now));
91+
}
92+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package com.zejian.structures.recursion;
2+
3+
/**
4+
* Created by zejian on 2016/12/11.
5+
* Blog : http://blog.csdn.net/javazejian [原文地址,请尊重原创]
6+
* 汉诺塔的递归算法实现
7+
*/
8+
public class HanoiRecursion {
9+
10+
/**
11+
* @param n 汉诺塔的层数
12+
* @param x x柱 起点柱(A)
13+
* @param y y柱 目标柱(B)
14+
* @param z z柱 中转柱(C)
15+
* 其中 A B C 只是作为辅助思考
16+
*/
17+
public void hanoi(int n, char x ,char y ,char z){
18+
19+
//H(0)=0
20+
if (n==0){
21+
//什么也不做
22+
}else {
23+
//H(n)=H(n-1) + 1 H(n-1)
24+
//将n-1个圆盘从x移动到z,y为中转柱
25+
hanoi(n-1,x,z,y); //----------------------->解出n-1层汉诺塔:H(n-1)
26+
27+
//移动最大圆盘到目的柱
28+
System.out.println(x+"->"+y);//------------> 1
29+
30+
//将n-1个圆盘从z移动到y,x为中转柱
31+
hanoi(n-1,z,y,x);//------------------------>解出n-1层汉诺塔:H(n-1)
32+
}
33+
34+
}
35+
36+
/**
37+
* @param n 汉诺塔的层数
38+
* @param x x柱 起点柱(A)
39+
* @param y y柱 目标柱(B)
40+
* @param z z柱 中转柱(C)
41+
* 其中 A B C 只是作为辅助思考
42+
*/
43+
public int hanoiCount(int n, char x ,char y ,char z){
44+
int moveCount=0;
45+
//H(0)=0
46+
if (n==0){
47+
//什么也不做
48+
return 0;
49+
}else {
50+
//H(n)=H(n-1) + 1 H(n-1)
51+
//将n-1个圆盘从x移动到z,y为中转柱
52+
moveCount += hanoiCount(n-1,x,z,y); //------------->解出n-1层汉诺塔:H(n-1)
53+
54+
//移动最大圆盘到目的柱
55+
moveCount += 1; //---------------------------------> 1
56+
57+
//将n-1个圆盘从z移动到y,x为中转柱
58+
moveCount +=hanoiCount(n-1,z,y,x);//--------------->解出n-1层汉诺塔:H(n-1)
59+
}
60+
61+
return moveCount;
62+
}
63+
//测试
64+
public static void main(String[] args){
65+
HanoiRecursion hanoi=new HanoiRecursion();
66+
System.out.println("moveCount="+hanoi.hanoiCount(6,'A','B','C'));
67+
68+
hanoi.hanoi(3,'A','B','C');
69+
}
70+
71+
}

0 commit comments

Comments
 (0)
X Tutup