用C计算两个数的GCD

时间:2013-08-12 16:31:30

标签: c recursion return

计算两个数字的GCD 的程序。

#include<stdio.h>
#include<conio.h>

int findgcd(int x,int y)
{
 while(x!=y)
 {
  if(x>y)
  {
   return findgcd(x-y,y);
  }
  else
  {
   return findgcd(x,y-x);
  }
 }
 return x;
}

void main()
{
 int n1,n2,gcd;
 clrscr();
 printf("\n GCD Calculator [ Please Enter Positive Integer number. ]\n");
 printf("\nEnter 1st numbers: ");
 scanf("%d",&n1);
 printf("\nEnter 2nd numbers: ");
 scanf("%d",&n2);
 if(n1>0 && n2>0)
 {
  gcd=findgcd(n1,n2);
  printf("\nGCD of %d and %d is: %d ",n1,n2,gcd);
 }
 else
 {
  printf("\n Sorry, Wrong Input.");
 }
 getch();
}

是否有另一种方法可以用C中的递归来计算两个数字的GCD。

或者,如果没有递归,我怎么能以简单的方式编写这个程序?

4 个答案:

答案 0 :(得分:2)

返回机制在此程序中非常正常。要了解多个return语句如何从函数中解析为单个返回点,您需要了解whileif...else的工作方式。

我建议你尝试将

这两个想法分开
  • 执行该函数的单个实例。
  • 调用自身的函数的递归性质。

声明

return anyfunc();

是代码路径中遇到的单个返回点。它调用另一个函数,然后返回该函数返回的任何内容。由于if ... else ...仅执行两个从属语句中的一个,因此将仅调用两个返回中的一个。最后一个捕获了循环的初始条件为假的情况,因此从未输入循环。

递归问题是一种不同的蠕虫,但你需要明确上述内容,否则递归会让你无可救药地混淆。 :(

答案 1 :(得分:0)

也许更清楚一点:

int findgcd(int x,int y)
{
 if(x!=y)
 {
  if(x>y)
  {
   return findgcd(x-y,y);
  }
  else
  {
   return findgcd(x,y-x);
  }
 }
 return x;
}

答案 2 :(得分:0)

return findgcd(x, y-x);

与以下内容相同:

int t = findgcd(x, y-x);
return t;

我希望这可以帮助您看到它只返回一个值。

答案 3 :(得分:0)

return findgcd(var1,var2)是递归的。 findgcd()一直在调用自己,直到条件语句while不再为真 - 这实际上并不正确,它应该是if。一旦不成立,它将返回输入的参数x。返回x后,堆栈将展开,直至gcd=findgcd(n1,n2);被击中。