Java数据结构_6.递归(斐波那契和汉诺塔)

这篇博客介绍了如何使用Java实现递归解决斐波那契数列和汉诺塔问题。斐波那契数列是编程中常见的递归实例,而汉诺塔游戏则是一个经典的递归问题。博客详细阐述了汉诺塔的移动规则,并给出了将所有盘子从A柱移动到C柱的详细步骤。
摘要由CSDN通过智能技术生成

一、递归

在这里插入图片描述

package com.xianxing.digui;

/**
 * 递归
 * 
 * @author l1
 *
 */
public class TestRecursive {

	public static void main(String[] args) {
		print(10);// 10 9 8 7 6 5 4 3 2 1
	}

	public static void print(int i) {
		if (i > 0) {
			System.out.print(i + " ");
			print(i -= 1);
		}
	}
}

二、斐波那契数列

package com.xianxing.digui;

public class TestFebonacci {

	public static void main(String[] args) {
		// 斐波那契数列1 1 2 3 5 8 13
		// 前两项为1,第三项之后等于之前的两项之和
		System.out.println(febonacci(6));// 8
	}

	// 打印第n项斐波那契数列
	public static int febonacci(int i) {
		if (i == 1 || i == 2) {
			return 1;
		} else {
			return febonacci(i - 1) + febonacci(i - 2);
		}
	}
}

三、汉诺塔

汉诺游戏规则如下:

1、有三根相邻的柱子,从左到右
标号为A,B,C。

2、A柱子上从下到上按金字塔状叠放着n个不同dao大小的圆盘。

3、现在把所有盘子一个一个移动到柱子C上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方。

在这里插入图片描述

在这里插入图片描述

package com.xianxing.digui;

/**
 * 汉诺塔问题
 * 
 * @author l1
 *
 */
public class TestHanoi {

	public static void main(String[] args) {
		hanoi(4, 'A', 'B', 'C');
	}

	/**
	 * @param n    共有n个盘子
	 * @param from 开始的柱子
	 * @param in   中间的柱子
	 * @param to   目标柱子
	 */
	public static void hanoi(int n, char from, char in, char to) {
		// 只有1个盘子
		if (n == 1) {
			System.out.println("第1个盘子从" + from + "移到" + to);
		} else {
			// 无论有多少盘子,都可认为2个盘子的递归,上面的所有盘子和下面的一个盘子。
			// 移动上面的所有盘子到中间柱子
			hanoi(n - 1, from, to, in);
			// 移动下面的盘子
			System.out.println("第" + n + "个盘子从" + from + "移到" + to);
			// 把上面的所有盘子从中间位置移到目标位置
			hanoi(n - 1, in, from, to);
		}
	}
}

输出:
第1个盘子从A移到B
第2个盘子从A移到C
第1个盘子从B移到C
第3个盘子从A移到B
第1个盘子从C移到A
第2个盘子从C移到B
第1个盘子从A移到B
第4个盘子从A移到C
第1个盘子从B移到C
第2个盘子从B移到A
第1个盘子从C移到A
第3个盘子从B移到C
第1个盘子从A移到B
第2个盘子从A移到C
第1个盘子从B移到C

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值