【问题标题】:calculate GCD of two numbers in C [closed]计算C中两个数字的GCD [关闭]
【发布时间】:2013-08-14 01:36:14
【问题描述】:

计算两个数字的 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。

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

【问题讨论】:

  • 是什么让你认为findgcd() 返回两个值?
  • "要了解递归,您需要了解递归..."
  • 替换告诉你使用void main()的书;它的作者不太了解这种语言。 int main(void) 是正确的。
  • 虽然我觉得downvotes很难判断,但我不明白的是upvotes ...
  • @KeithThompson 我的错。法语是我的母语 :) 我编辑了

标签: c recursion return


【解决方案1】:

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

我建议你试着把这两个想法分开

  • 函数的单个实例的执行。
  • 函数调用自身的递归性质。

声明

return anyfunc();

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

递归问题是一种不同的蠕虫,但你需要清楚以上内容,否则递归会让你陷入绝望的困惑。 :(

【讨论】:

    【解决方案2】:

    return findgcd(var1,var2) 是递归的。 findgcd() 不断调用自己,直到条件语句 while 不再为真——这实际上并不正确,它应该是 if。一旦它不是真的,它返回输入的参数x。一旦x 返回,堆栈就会解开,直到gcd=findgcd(n1,n2); 被命中。

    【讨论】:

      【解决方案3】:
      return findgcd(x, y-x);
      

      与以下内容相同:

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

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

      【讨论】:

      • 但是随着while,这个循环不会无限循环吗?
      • @Jim 我只想解决问题的多个返回值部分,因为它已被突出显示。是的,代码可能还有其他问题。
      • 我明白,只是一个评论澄清。我以为他指的是一次返回多个东西,而不是多个返回,但你的解释更有意义。一般来说,递归调用应该有一个返回值。
      【解决方案4】:

      也许更清楚一点:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-24
        • 2021-03-23
        • 2014-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多