C++ 计算河内塔楼中的函数调用?
所以我想计算调用函数moveSingleDisk()的次数,但我似乎无法计算出来。。。使用此代码:C++ 计算河内塔楼中的函数调用?,c++,recursion,towers-of-hanoi,C++,Recursion,Towers Of Hanoi,所以我想计算调用函数moveSingleDisk()的次数,但我似乎无法计算出来。。。使用此代码: #include <iostream> using namespace std; void moveTower(int n, char start, char finish, char temp, int count); void moveSingleDisk(char moveFrom, char moveTo, int count); void calcHanoi(int n);
#include <iostream>
using namespace std;
void moveTower(int n, char start, char finish, char temp, int count);
void moveSingleDisk(char moveFrom, char moveTo, int count);
void calcHanoi(int n);
int main (int argc, const char * argv[])
{
calcHanoi(5);
return 0;
}
void calcHanoi(int n)
{
int count = 0;
moveTower(n, 'A', 'B', 'C', count);
}
void moveTower(int n, char start, char finish, char temp, int count)
{
if (n == 1)
{
count++;
moveSingleDisk(start, finish, count);
return;
}
moveTower(n-1, start, temp, finish, count);
count++;
moveSingleDisk(start, finish, count);
moveTower(n-1, temp, finish, start, count);
}
void moveSingleDisk(char moveFrom, char moveTo, int count)
{
cout << count << ": " << moveFrom << " -> " << moveTo << endl;
}
我曾试图追踪问题,但递归使得追踪这类事情相当困难(至少对我而言)
任何帮助或解释都将不胜感激!谢谢:)您正在按值传递
count
,因此对moveTower
的递归调用不会修改它的本地副本。而是通过引用传递:
void moveTower(int n, char start, char finish, char temp, int & count)
^
在
moveSingleDisk
中增加计数器可能比在每次调用它之前更整洁,因此您可以确保不会错过任何调用。在这种情况下,您也需要通过引用传递。您通过值传递count
,因此对moveTower
的递归调用不会修改它的本地副本。而是通过引用传递:
void moveTower(int n, char start, char finish, char temp, int & count)
^
在
moveSingleDisk
中增加计数器可能比在每次调用它之前更整洁,因此您可以确保不会错过任何调用。在这种情况下,您也需要通过引用传递到那里。使用递归数据/算法,函数方法可以简化代码:从递归函数返回计数,“聚合”嵌套级别。但这样会丢失“步长”计数的显示
int moveTower(int n, char start, char finish, char temp);
int moveSingleDisk(char moveFrom, char moveTo);
void calcHanoi(int n);
int main (int argc, const char * argv[])
{
calcHanoi(5);
return 0;
}
void calcHanoi(int n)
{
int count = moveTower(n, 'A', 'B', 'C');
}
int moveTower(int n, char start, char finish, char temp)
{
if (n == 1)
return moveSingleDisk(start, finish);
return
moveTower(n-1, start, temp, finish) +
moveSingleDisk(start, finish) +
moveTower(n-1, temp, finish, start);
}
int moveSingleDisk(char moveFrom, char moveTo)
{
cout << moveFrom << " -> " << moveTo << endl;
return 1;
}
int-moveTower(int-n,char-start,char-finish,char-temp);
int moveSingleDisk(char moveFrom,char moveTo);
void calcHanoi(国际北);
int main(int argc,const char*argv[]
{
calcHanoi(5);
返回0;
}
void calcHanoi(内部北)
{
int count=移动塔(n,‘A’、‘B’、‘C’);
}
int moveTower(int n,字符开始,字符结束,字符温度)
{
如果(n==1)
返回单个磁盘(开始、完成);
回来
移动塔(n-1,开始,温度,结束)+
移动单磁盘(开始、完成)+
移动塔(n-1,温度,完成,启动);
}
int moveSingleDisk(char moveFrom,char moveTo)
{
cout使用递归数据/算法时,函数方法可以简化代码:从递归函数返回计数,“聚合”嵌套级别。但这样会丢失“步骤”计数的显示
int moveTower(int n, char start, char finish, char temp);
int moveSingleDisk(char moveFrom, char moveTo);
void calcHanoi(int n);
int main (int argc, const char * argv[])
{
calcHanoi(5);
return 0;
}
void calcHanoi(int n)
{
int count = moveTower(n, 'A', 'B', 'C');
}
int moveTower(int n, char start, char finish, char temp)
{
if (n == 1)
return moveSingleDisk(start, finish);
return
moveTower(n-1, start, temp, finish) +
moveSingleDisk(start, finish) +
moveTower(n-1, temp, finish, start);
}
int moveSingleDisk(char moveFrom, char moveTo)
{
cout << moveFrom << " -> " << moveTo << endl;
return 1;
}
int-moveTower(int-n,char-start,char-finish,char-temp);
int moveSingleDisk(char moveFrom,char moveTo);
void calcHanoi(国际北);
int main(int argc,const char*argv[]
{
calcHanoi(5);
返回0;
}
void calcHanoi(内部北)
{
int count=移动塔(n,‘A’、‘B’、‘C’);
}
int moveTower(int n,字符开始,字符结束,字符温度)
{
如果(n==1)
返回单个磁盘(开始、完成);
回来
移动塔(n-1,开始,温度,结束)+
移动单磁盘(开始、完成)+
移动塔(n-1,温度,完成,启动);
}
int moveSingleDisk(char moveFrom,char moveTo)
{
cout如果只需要对moveSingleDisk
进行计数调用,只需在moveSingleDisk
static int count = 0;
count++;
看看这个例子,您不需要传递计数器参数
#include <iostream>
using namespace std;
int f(){
static int i = 0;
cout << i++;
return i < 5 ? f() : 5;
}
int main(){
f();
return 0;
}
#包括
使用名称空间std;
int f(){
静态int i=0;
cout如果只需要对moveSingleDisk
进行计数调用,只需在moveSingleDisk
static int count = 0;
count++;
看看这个例子,您不需要传递计数器参数
#include <iostream>
using namespace std;
int f(){
static int i = 0;
cout << i++;
return i < 5 ? f() : 5;
}
int main(){
f();
return 0;
}
#包括
使用名称空间std;
int f(){
静态int i=0;
你为什么不使用一个静态变量呢?或者如果你想保留代码的基本信息,那么就不要通过引用或指针来传递count。为什么不使用一个静态变量呢?或者如果你想保留代码的基本信息,那么就不要通过引用或指针来传递count。呃,这是一个初学者的错误:谢谢迈克。呃,这样一个初学者的错误:P谢谢迈克。这是更干净的,tbh,因为它强调了计数器专门属于moveSingleDisk
函数的概念,并且是该函数的状态。这是更干净的,tbh,因为它强调了计数器专门属于moveSingleDisk
函数的概念,并且是s泰特为这个功能。