Java模拟汉诺塔移位、阶乘、斐波那契数列操作
1.汉诺塔移位操作
package hanoi;
import java.util.Scanner;
/**
* 汉诺塔
* @author wsz
* @date 2018年1月20日
*/
public class HanoiDemo {
static int count = 0;
/**
* n=1 a->c
* n=2
* |递归(1,a,c,b):a->b(1次) 结束递归
* |a->c(2次)
* |递归(1,b,a,c):b->c(3次) 结束递归
* |结束
* n=3
* |递归(2,a,c,b) 与n=2一致(共三次)
* |a->c(4次)
* |递归(2,b,a,c) 与n=2一致(共三次)
* n=* 总次数n^2-1
* @param n 盘子数量
* @param a 源位座
* @param b 辅助座
* @param c 目标座
*/
static void hanoi(int n, char a, char b, char c) {
if(n == 1) {
System.out.println("第"+(++count)+"次从"+a+"到"+c);
}else {
hanoi(n-1,a,c,b); //将a上的n-1个移到b
System.out.println("第"+(++count)+"次从"+a+"到"+c); //将a上的最后一个移到c
hanoi(n-1,b,a,c); //将b上的n-1个移到c
}
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("输入数量:");
int num = input.nextInt();
hanoi(num,'a','b','c');
input.close();
}
}
2.阶乘
package hanoi;
import java.util.Scanner;
/**
* 递归阶乘 n! = n*(n-1)*(n-2)*(n-3)*...*2*1
* @author wsz
* @date 2018年1月20日
*/
public class Factorial {
/**
* 递归解决
* @param n
* @return
*/
static long fact(long n) {
if(n <= 1) {
print(n);
return 1;
}else {
print(n);
return n*fact(n-1);
}
}
/**
* 循环解决
* @param n
*/
static long fact2(long n) {
int i;
long res =1L;
for(i = 1; i <= n; i++) {
res *= i;
}
return res;
}
static void print(long n) {
if(n <= 1)
System.out.print(n);
else
System.out.print(n+"*");
}
public static void main(String[] args) {
System.out.println("输入需要阶乘的数字:");
Scanner input = new Scanner(System.in);
int num = input.nextInt();
long fact = fact(num);
System.out.println("");
System.out.println(fact);
System.out.println(fact2(num));
input.close();
}
}
3.斐波那契数列
package hanoi;
import java.util.Scanner;
/**
* 菲波那切数列:1+1+2+3+5+8+13+...
* @author wsz
* @date 2018年1月20日
*/
public class Fibonacci {
/**
* 获取某一下标位置的值
* @param n
* @return
*/
static long fib(long n) {
if(n <= 2 ) {
return 1;
}else {
return fib(n-1)+fib(n-2); //返回之前2个数字的求和
}
}
/**
* 进行求和
* @param n
* @return
*/
static long fib2(long n) {
int i;
long res =0L;
String str = "";
for(i = 1; i <= n; i++) {
long fib = fib(i);
res += fib;
str += String.valueOf(fib)+"+";
}
System.out.println(str.substring(0, str.length()-1)+"="+res);
return res;
}
public static void main(String[] args) {
System.out.println("获取斐波那契数的下标位置:");
Scanner input = new Scanner(System.in);
int num = input.nextInt();
long fib = fib(num); //获取下标位置的值
System.out.println(fib);
System.out.println(fib2(num)); //进行求和输出
input.close();
}
}