【递归算法】Java模拟汉诺塔移位、阶乘、斐波那契数列操作

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();
	}

}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值