Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 计算河内塔楼中的函数调用?_C++_Recursion_Towers Of Hanoi - Fatal编程技术网

C++ 计算河内塔楼中的函数调用?

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);

所以我想计算调用函数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);

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泰特为这个功能。