更新移动计数(计数器)-河内塔-C程序

更新移动计数(计数器)-河内塔-C程序,c,recursion,C,Recursion,我编写了这个C程序,用于在跟踪路径的同时将多个磁盘(n)从peg a移动到peg C。但是,我不知道如何/在何处进行计数呼叫/增量,以便在最后跟踪并打印出移动总数。如有任何建议,将不胜感激。(最初我让它在TOH函数中打印,但该函数不起作用,因此我删除了printf(..)行) 我改变了变量,这样可以增加可读性;然而,计数输出是远远不够的。对于板数=3,计数=239。对于板数4,计数=130431 #include <stdio.h> int TOH(int,char,char,c

我编写了这个C程序,用于在跟踪路径的同时将多个磁盘(n)从peg a移动到peg C。但是,我不知道如何/在何处进行计数呼叫/增量,以便在最后跟踪并打印出移动总数。如有任何建议,将不胜感激。(最初我让它在TOH函数中打印,但该函数不起作用,因此我删除了printf(..)行) 我改变了变量,这样可以增加可读性;然而,计数输出是远远不够的。对于板数=3,计数=239。对于板数4,计数=130431

 #include <stdio.h>
 int TOH(int,char,char,char);
 int main()
 {
   int n;
   printf("\nEnter number of plates:");
   scanf("%d",&n);
    int c = TOH(n,'A','C','B');
    printf("\n");
    printf("Total number of moves = %d \n ", c);
  return 0;
  }
  int TOH(int n,char first,char third,char second)
 {
   int count;
  if(n>0){
     count=TOH(n-1, first, second, third);
     printf("Move disk %d from peg %c to peg %c\n", n, first, third);
     count++;
     count+= TOH(n-1, second, third, first);
     }
  return count;
 }
#包括
int-TOH(int,char,char,char);
int main()
{
int n;
printf(“\n输入板数:”);
scanf(“%d”和“&n”);
int c=TOH(n,'A','c','B');
printf(“\n”);
printf(“移动总数=%d\n”,c);
返回0;
}
int-TOH(int-n,char-first,char-third,char-second)
{
整数计数;
如果(n>0){
计数=TOH(n-1,第一,第二,第三);
printf(“将磁盘%d从peg%c移动到peg%c\n”,n,第一个,第三个);
计数++;
计数+=TOH(n-1,第二,第三,第一);
}
返回计数;
}

将函数中的
计数值返回到
。为此,您必须从
main
as调用它

int c = TOH(n,'A','C','B');  
并将函数的返回类型更改为
int

int TOH(int,char,char,char);  
我稍微改变了你的功能:

int TOH(int n,char x,char y,char z)
{
   int count = 0;
   if(n>0){
       count = TOH(n-1, x, z, y);
       printf("\nMove disk %d from peg %c to peg %c\n", n, x, y);
       count++;
       count += TOH(n-1, z, y, x) ;
   }
   return count;
}

最简单的方法是使
count
成为一个全局变量,即

#include <stdio.h>
void TOH(int,char,char,char);
unsigned int count;
/* what you have, but remove the declaration of `count` from `TOH` */
#包括
void TOH(int,char,char,char);
无符号整数计数;
/*您拥有的,但将'count'声明从'TOH'中删除*/
然后,您可以从
TOH
main
访问
count
,它将是相同的变量


您可能还想在
TOH
中只增加
count
一次(我想就在
printf
之后)。

如果您打算推荐此策略,您还应该解释
TOH
需要如何在内部处理
count
,因为它不再像在正确的点上增加它那么简单了。@Zack在我看来是相当琐碎的摆弄:
返回到h(n-1,x,y,z)+TOH(n-1,z,y,x)+1@Zack;他在使用递归,我想他不是那么初学者。那么我把TOH(n-1,x,y,z)+TOH(n-1,z,y,x)+1放在哪里呢。我知道这是递归调用的总数,但将其放置在何处是我的主要任务concern@haccks明白我的意思吗?来吧,我们不要教c新手全局变量是解决问题的好方法…@TaylorBrandstetter这是解决这个问题的最简单方法,这使得它成为了一个很好的玩具程序的方法。教新程序员仅仅因为一个原因而避免使用全局变量,这和教他们仅仅因为一个原因而避免使用
goto
一样糟糕。为什么最简单?另一种解决办法对我来说似乎更简单。而且,这是一种不好的做法,也是有原因的。这意味着他只能从main调用该函数一次,或者每次调用之前都必须记住重置计数。全局变量限制了函数的可移植性和自包含性,如果它没有任何优势,就没有理由使用它。@TaylorBrandstetter也许更准确地说,“这是对OP代码的最小更改,使它工作起来”。无论如何,是的,如果这是一个更大的应用程序的一部分,你和我会立即看到所有潜在的问题,但是(a)它不是,(b)OP如何了解为什么全局变量是一个问题,如果它们被教条远离它们?(如果我写了这个家庭作业,我可能会要求学生用两种方式编码,然后列出选择其中一种的原因。)