递归——解汉诺塔

汉诺塔

在这里插入图片描述
目标:一次移动一个。将A中所有移动到C中。
大的不能放在小的下面。

在线玩:http://www.htmleaf.com/Demo/201508272485.html
力扣题(没什么用):https://leetcode-cn.com/problems/hanota-lcci/

递归思路

一个:直接放到目标处。
二个:先把一放到缓存,再放二到目标处。
。。。
N个:先把上面的所有放到缓存,再放到目标处。

总结一下就是:
1,把我上面的放到缓存中。
2,把我放到目标处。
3,把缓存中的放到目标处。

全部代码

不多,但看上去很绕。

//统计步数
let count = 0
//三个数组
let A = [5, 4, 3, 2, 1]
let B = []
let C = []
//打印状态
function printInfo() {
    
    
	console.log("A:" + A)
	console.log("B:" + B)
	console.log("C:" + C)
	console.log("=============================" + (++count))
}

//调用
han(A.length, A, C, B)

function han(n, from, to, middle) {
    
    
	//最上面的一个,直接push,pop,打印状态
	if (n === 1) {
    
    
		to.push(from.pop())
		printInfo()
		//下面的N个,三步走
	} else {
    
    
		han(n - 1, from, middle, to)
		han(1, from, to, middle)
		han(n - 1, middle, to, from)
	}
}

效果:5个元素需要31步。

在这里插入图片描述
8个元素需要255步。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_37284843/article/details/123921072