c++ - 计数汉诺塔中的函数调用?

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

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

我得到以下输出:

1: A -> B
1: A -> C
2: B -> C
1: A -> B
2: C -> A
2: C -> B
3: A -> B
1: A -> C
2: B -> C
2: B -> A
3: C -> A
2: B -> C
3: A -> B
3: A -> C
4: B -> C
1: A -> B
2: C -> A
2: C -> B
3: A -> B
2: C -> A
3: B -> C
3: B -> A
4: C -> A
2: C -> B
3: A -> B
3: A -> C
4: B -> C
3: A -> B
4: C -> A
4: C -> B
5: A -> B

我试图追踪问题,但是递归使得追踪这类事情变得非常困难(至少对我而言)。

任何帮助或解释将不胜感激!谢谢:)

最佳答案

如果你只是需要调用 moveSingleDisk 的次数,只需在 moveSingleDisk 中创建

static int count = 0;
count++;

看这个例子,不需要传counter参数

#include <iostream>

using namespace std;

int f(){
  static int i = 0;
  cout << i++;
  return i < 5 ? f() : 5;
}

int main(){
  f();
  return 0;
}

关于c++ - 计数汉诺塔中的函数调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9320757/

相关文章:

c++ - enable_if 可以用作非额外参数(例如,用于构造函数)吗?

c++ - 在数组中存储一个大于 9 的数字

Swift:确定树中的节点

c - 我不明白这个程序是做什么的,它是一个递归程序

java - 汉诺塔代码中的错误

c++ - 如何通过套接字发送PDF文件?

c++ - boost spirit 莱克斯和气。集成跳过解析器

Javascript递归计数

python - 如何从递归末尾消除 'None'

python - 汉诺塔非递归函数