很多站长朋友们都不太清楚php河内塔问题,今天小编就来给大家整理php河内塔问题,希望对各位有所帮助,具体内容如下:
本文目录一览: 1、 谁帮我解释一下河内塔程序? 2、 汉诺塔问题? 3、 河内塔问题经常犯的错误 4、 帮我解释一下这段代码(递归),在线等!!!! 5、 河内塔问题怎么解决 6、 河内塔问题的影响因素 谁帮我解释一下河内塔程序?汉诺塔问题是程序设计中的经典递归问题。 算法思路: 1.如果只有一个金片,则把该金片从源移动到目标棒,结束。 2.如果有n个金片,则把前n-1个金片移动到辅助的棒,然后把自己移动到目标棒,最后再把前n-1个移动到目标棒 补充:汉诺塔的算法实现(c++) #include <fstream> #include <iostream> using namespace std; ofstream fout("out.txt"); void Move(int n,char x,char y) { fout<<"把"<<n<<"号从"<<x<<"挪动到"<<y<<endl; } void Hannoi(int n,char a,char b,char c) { if(n==1) Move(1,a,c); else { Hannoi(n-1,a,c,b); Move(n,a,c); Hannoi(n-1,b,a,c); } } int main() { fout<<"以下是7层汉诺塔的解法:"<<endl; Hannoi(7,'a','b','c'); fout.close(); cout<<"输出完毕!"<<endl; return 0; } C语言精简算法 /* Copyrighter by SS7E */ #include<stdio.h> /* Copyrighter by SS7E */ void hanoi(int n,char A,char B,char C) /* Copyrighter by SS7E */ { if(n==1) { printf("Move disk %d from %c to %c\n",n,A,C); } else { hanoi(n-1,A,C,B); /* Copyrighter by SS7E */ printf("Move disk %d from %c to %c\n",n,A,C); hanoi(n-1,B,A,C); /* Copyrighter by SS7E */ } } main() /* Copyrighter by SS7E */ { int n; printf("请输入数字n以解决n阶汉诺塔问题:\n"); scanf("%d",n); hanoi(n,'A','B','C'); }/* Copyrighter by SS7E */ PHP算法: <?php function hanoi($n,$x,$y,$z){ if($n==1){ move($x,1,$z); }else{ hanoi($n-1,$x,$z,$y); move($x,$n,$z); hanoi($n-1,$y,$x,$z); } } function move($x,$n,$z){ echo 'move disk '.$n.' from '.$x.' to '.$z.'<br>'; } hanoi(10,'x','y','z'); ?> JAVA算法: public class Haniojava { public static void main(String args[]) { byte n=2; char a='A',b='B',c='C'; hanio(n,a,b,c); } public static void hanio(byte n,char a,char b,char c) { if(n==1) System.out.println("move "+a+" to "+b); else { hanio((byte)(n-1),a,c,b); System.out.println("move "+a+" to "+b); hanio((byte)(n-1),c,b,a); } } }
汉诺塔问题?汉诺塔(又称河内塔)问题是印度的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。解答结果请自己运行计算,程序见尾部。面对庞大的数字(移动圆片的次数)18446744073709551615,看来,众僧们耗尽毕生精力也不可能完成金片的移动。
后来,这个传说就演变为汉诺塔游戏:
1.有三根杆子A,B,C。A杆上有若干碟子
2.每次移动一块碟子,小的只能叠在大的上面
3.把所有碟子从A杆全部移到C杆上
经过研究发现,汉诺塔的破解很简单,就是按照移动规则向一个方向移动金片:
如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C
此外,汉诺塔问题也是程序设计中的经典递归问题。
算法思路:
1.如果只有一个金片,则把该金片从源移动到目标棒,结束。
2.如果有n个金片,则把前n-1个金片移动到辅助的棒,然后把自己移动到目标棒,最后再把前n-1个移动到目标棒
(非专业人士可以忽略以下内容)
补充:汉诺塔的算法实现(c++)
#include
#include
using namespace std;
ofstream fout("out.txt");
void Move(int n,char x,char y)
{
fout<<"把"<<n<<"号从"<<x<<"挪动到"<<y<<endl;
}
void Hannoi(int n,char a,char b,char c)
{
if(n==1)
Move(1,a,c);
else
{
Hannoi(n-1,a,c,b);
Move(n,a,c);
Hannoi(n-1,b,a,c);
}
}
int main()
{
fout<<"以下是7层汉诺塔的解法:"<<endl;
Hannoi(7,'a','b','c');
fout.close();
cout<<"输出完毕!"<<endl;
return 0;
}
C语言精简算法
/* Copyrighter by SS7E */
#include /* Copyrighter by SS7E */
void hanoi(int n,char A,char B,char C) /* Copyrighter by SS7E */
{
if(n==1)
{
printf("Move disk %d from %c to %c\n",n,A,C);
}
else
{
hanoi(n-1,A,C,B); /* Copyrighter by SS7E */
printf("Move disk %d from %c to %c\n",n,A,C);
hanoi(n-1,B,A,C); /* Copyrighter by SS7E */
}
}
main() /* Copyrighter by SS7E */
{
int n;
printf("请输入数字n以解决n阶汉诺塔问题:\n");
scanf("%d",n);
hanoi(n,'A','B','C');
}/* Copyrighter by SS7E */
PHP算法:
<?php
function hanoi($n,$x,$y,$z){
if($n==1){
move($x,1,$z);
}else{
hanoi($n-1,$x,$z,$y);
move($x,$n,$z);
hanoi($n-1,$y,$x,$z);
}
}
function move($x,$n,$z){
echo 'move disk '.$n.' from '.$x.' to '.$z.'
';
}
hanoi(10,'x','y','z');
?>
JAVA算法:
public class Haniojava
{
public static void main(String args[])
{
byte n=2;
char a='A',b='B',c='C';
hanio(n,a,b,c);
}
public static void hanio(byte n,char a,char b,char c)
{
if(n==1)
System.out.println("move "+a+" to "+b);
else
{
hanio((byte)(n-1),a,c,b);
System.out.println("move "+a+" to "+b);
hanio((byte)(n-1),c,b,a);
}
}
}
#include
void move(char ch1, char cstrong) {
cout<<ch1<"<<cstrong<<' ';
}
void hanoi(int n, char a, char b, char c) {
if (n==1)
move (a,c);
else {
hanoi (n-1,a,c,b);
move (a,c);
hanoi (n-1,b,a,c);
}
}
void main() {
int m;
cout<<"Enter the number of disk to move:\n";
cin>>m;
cout<<"The step to moving "<<m<<" disk:\n";
hanoi (m,'A','B','C');
cin>>m;
}
用不了这么复杂
,设A上有n个盘子。
如果n=1,则将圆盘从A直接移动到C。
如果n=2,则:
1.将A上的n-1(等于1)个圆盘移到B上;
2.再将A上的一个圆盘移到C上;
3.最后将B上的n-1(等于1)个圆盘移到C上。
如果n=3,则:
A. 将A上的n-1(等于2,令其为n`)个圆盘移到B(借助于C),步骤如下:
(1)将A上的n`-1(等于1)个圆盘移到C上。
(2)将A上的一个圆盘移到B。
(3)将C上的n`-1(等于1)个圆盘移到B。
B. 将A上的一个圆盘移到C。
C. 将B上的n-1(等于2,令其为n`)个圆盘移到C(借助A),步骤如下:
(1)将B上的n`-1(等于1)个圆盘移到A。
(2)将B上的一个盘子移到C。
(3)将A上的n`-1(等于1)个圆盘移到C。
到此,完成了三个圆盘的移动过程。
从上面分析可以看出,当n大于等于2时,移动的过程可分解为三个步骤:
第一步 把A上的n-1个圆盘移到B上;
第二步 把A上的一个圆盘移到C上;
第三步 把B上的n-1个圆盘移到C上;其中第一步和第三步是类同的。
当n=3时,第一步和第三步又分解为类同的三步,即把n`-1个圆盘从一个针移到另一个针上,这里的n`=n-1。 显然这是一个递归过程,据此算法可编程如下:
move(int n,int x,int y,int z)
{
if(n==1)
printf("%c-->%c\n",x,z);
else
{
move(n-1,x,z,y);
printf("%c-->%c\n",x,z);
move(n-1,y,x,z);
}
}
main()
{
int h;
printf("\ninput number:\n");
scanf("%d",h);
printf("the step to moving %2d diskes:\n",h);
move(h,'a','b','c');
}
河内塔问题经常犯的错误河内塔问题经常犯的错误是人们的认知错觉导致的。河内塔问题是问题解决研究中的经典实验。给出柱子1、2、3,在柱1上,有一系列圆盘,自上而下圆盘的大小是递增的,构成金字塔状。要求被试将柱1的所有圆盘移到柱3上去,且最终在柱3上仍构成金字塔排列,规则是每次只能移动一个圆盘,且大盘不可压在小盘之上等来测试人们的认知能力。
帮我解释一下这段代码(递归),在线等!!!!因为num=2,所以执行else里面的语句hano4(num-1, first, third, second),在这方法里面num-1变为1,执行System.out.println(first + "-->" + third)输出A-->B;完成后跳出,num还是等于2,继续执行System.out.println(first + "-->" + third)输出A-->C,继续执行遇到hano4(num-1, second, first, third)时,num-1为1,再输出B-->C,程序结束.最后执行的System.out.println(first + "-->" + third)不是在else里面,而是if (num == 1) {
System.out.println(first + "-->" + third);
}里面的println(first + "-->" + third)
河内塔问题怎么解决问题:
首先去掉原来的神话色彩:神庙、僧侣和世界末日,来到问题的数学本质。有A、B、C三根柱子。A上堆放了n个盘子,每个盘子都比它下面的盘子小一些。现在要把盘子全部搬到C上去,条件是每次只能搬动一个盘子,而且任何时候都不能放在比它小的盘子上面(显然,必须用到B作为中转)。怎么搬动这些盘子呢?
解决:
玩一下这个游戏,很快就会发现,想把n个盘子搬到C,必须先把上面的n-1个盘子搬到B,然后把第n个盘子搬到C,最后再把n-1个盘子搬过来。整个过程是这样的:
1,把上面的n-1个盘子从A搬到B,以C作为中转;
2,把第n个盘子从A搬到C;
3,把n-1个盘子从B搬到C,以A作为中转。
也就是说,要解决n个盘子的问题,先要解决n-1个盘子的问题。而这个问题与前一个是类似的,可以用相同的办法解决。最终,我们会来到只有一个盘子的情况,很简单,直接把盘子从A搬到C即可。通过以上分析可以写出:
void hanoi (int n, char src, char mid, char dst)
{
if (n == 1)
cout << " move " << src << " to " << dst << endl;
else
{
hanoi (n-1, src, dst, mid);
cout << "move " << src << " to " << dst << endl;
hanoi (n-1, mid, src, dst);
}
}
河内塔问题的影响因素思维方式。河内塔问题是源于印度一个古老传说的益智玩具,主要的影响因素是各种不同的被试在实验时所采取的思维方式。河内塔问题是现代认知心理学用于研究人的问题解决过程的心理特点的一个实验,要求探索从初始状态到目标状态的通路,最终解决问题,达到目标状态。被试者一边思考,一边大声报告出思考的内容。主试根据被试的口头报告,分析其思维活动过程。
关于php河内塔问题的介绍到此就结束了,不知道本篇文章是否对您有帮助呢?如果你还想了解更多此类信息,记得收藏关注本站,我们会不定期更新哦。