更新移动计数(计数器)-河内塔-C程序
我编写了这个C程序,用于在跟踪路径的同时将多个磁盘(n)从peg a移动到peg C。但是,我不知道如何/在何处进行计数呼叫/增量,以便在最后跟踪并打印出移动总数。如有任何建议,将不胜感激。(最初我让它在TOH函数中打印,但该函数不起作用,因此我删除了printf(..)行) 我改变了变量,这样可以增加可读性;然而,计数输出是远远不够的。对于板数=3,计数=239。对于板数4,计数=130431更新移动计数(计数器)-河内塔-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
#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如何了解为什么全局变量是一个问题,如果它们被教条远离它们?(如果我写了这个家庭作业,我可能会要求学生用两种方式编码,然后列出选择其中一种的原因。)