这是我解释递归的书中的代码.问题是我不明白该计划采取的步骤:
var hanoi = function(disc,src,aux,dst) {
if (disc > 0) {
hanoi(disc - 1,src,dst,aux);
document.write("Move disc " + disc + " from " + src + " to " + dst + "<br />");
hanoi(disc - 1,aux,src,dst);
}
};
hanoi(3,"src","aux","dst");
Run Code Online (Sandbox Code Playgroud)
这是输出的读取方式:
Move disc 1 from src to dst
Move disc 2 from src to aux
Move disc 1 from dst to aux
Move disc 3 from src to dst
Move disc 1 from aux to src
Move disc 2 from …Run Code Online (Sandbox Code Playgroud) 我对Python完全陌生,目前正在阅读有关河内塔和递归的教程。我以为我理解递归,直到他们给出了这个例子:
def moveTower(height,fromPole, toPole, withPole):
if height >= 1:
moveTower(height-1,fromPole,withPole,toPole)
moveDisk(fromPole,toPole)
moveTower(height-1,withPole,toPole,fromPole)
#print(withPole)
def moveDisk(fp,tp):
print("moving disk from",fp,"to",tp)
moveTower(3,"A","B","C")
Run Code Online (Sandbox Code Playgroud)
它用3张光盘打印出解决河内塔问题的正确举动:从A到B的移动磁盘从A到C的移动磁盘从B到C的移动磁盘从A到B的移动磁盘从C到A的移动磁盘从C的移动磁盘到B将磁盘从A移到B
我的问题是,它是怎么做到的?有人可以遍历代码行,以便我了解它如何打印正确的动作吗?我主要是混淆怎样的价值fp,并tp可以从改变A到B到C。抱歉,这是一个广泛的问题!任何帮助将不胜感激!
算法如下:
Algorithm move(k, from, to, spare)
if k >0 then
move(k?1, from, spare, to)
printf (”move top disc from %d to %d\n”,
from, to)
move(k?1, spare, to, from)
Run Code Online (Sandbox Code Playgroud)
k是磁盘的数量(http://en.wikipedia.org/wiki/Tower_of_Hanoi).我理解递归,我只是不明白这是如何工作的,任何人都可以理解这一点吗?
抱歉我的描述中含糊不清,只是我对发生的事情的理解也很模糊 - 我不知道printf线在做什么似乎对整个功能至关重要.
我在理解这个河内塔递归算法时遇到了问题:
public class MainClass {
public static void main(String[] args) {
int nDisks = 3;
doTowers(nDisks, 'A', 'B', 'C');
}
public static void doTowers(int topN, char from, char inter, char to) {
if (topN == 1){
System.out.println("Disk 1 from " + from + " to " + to);
}else {
doTowers(topN - 1, from, to, inter);
System.out.println("Disk " + topN + " from " + from + " to " + to);
doTowers(topN - 1, inter, from, to);
}
} …Run Code Online (Sandbox Code Playgroud) 嗨大家我在河内的塔上遇到了一个问题:
我们给了一堆交替颜色的圆柱体交替堆叠在一起.
我的工作是将相同颜色的两个堆栈分开,
我可以使用递归为常规的河内塔写代码(算法),但我无法弄清楚这一部分.有人可以帮忙吗?
常规河内问题的代码:
#include<iostream>
using namespace std;
int count=0;
void hanoi(char a,char b,char c,int x)
{
if(x>1)
{
hanoi(a,c,b,x-1);
hanoi(a,b,c,1);
hanoi(c,b,a,x-1);
}
else
{
cout<<"Move a Disk from "<<a<<" to "<<b<<endl; count++;
}
}
int main()
{
int n;
cout<<"Enter the height of stack";
cin>>n;
hanoi('A','B','C',n);
cout<<"\nNo. of changes done:"<<count;
return 0;
}
Run Code Online (Sandbox Code Playgroud)