C递归函数 - GCD

时间:2016-12-06 11:05:29

标签: c recursion

我最近开始学习C和编程,我们被告知制作一个程序,使用递归找到两个数字的GCD和LCM。

经过一番磨练后,我设法将它们结合起来。

#include<stdio.h>

int gcd(int a,int b);

int main()
{
    int a,b,l,temp;
    printf("Enter two numbers :\n");
    scanf("%d%d",&a,&b);
    if(a<b)
    {
        temp=a;
        a=b;
        b=temp;
    }
    l=gcd(a,b);
    printf("GCD = %i\nLCM = %i",l,a*b/l);

    return 0;
}

int gcd(int a,int b)
{
    static int c;
    c=a%b;
    a=b;
    b=c;
    if(c!=0)
    {
        gcd(a,b);
    }
    else
        return a;
}

现在由于某些我不知道的原因,如果没有“else”,该功能将无效。更具体地说是这样:

int gcd(int a,int b)
{
    static int c;
    c=a%b;
    a=b;
    b=c;
    if(c!=0)
    {
        gcd(a,b);
    }
        return a;
}

虽然与作业无关,但我觉得我应该明白这里的问题是什么。作为一个新手,我将不胜感激任何帮助。

如果问题太愚蠢或代码太乱,我会提前道歉。

2 个答案:

答案 0 :(得分:0)

您询问了代码中的问题。这里,

 static int c;

为什么它是静态的,而且你不需要第三个变量来使用递归来计算gcd。 和,

 gcd(a,b);

你在什么变量中返回gcd。这根本没有意义。它不是一个void函数,它返回一个int。

现在正确的方法,

    if (b != 0)
     return gcd(b, a%b);
    else 
     return a;

就是这样。

答案 1 :(得分:0)

问题是递归调用:

int gcd(int a,int b)
{
    static int c;
    c=a%b;
    a=b;
    b=c;
    if(c!=0)
    {
        gcd(a,b); // The problem is here 
    }
    else
        return a;
}

您已经采用了两种不同的方法:

  1. 在上述情况下,如果c!=0,则没有return语句。你的函数来返回int。通常编译器会给出警告,因为您将返回一个随机数see here。所以,让我们说你的函数与其他人一起工作是幸运的。
  2. 如果没有else语句,您将始终返回a。你计算gcd,但你永远不会使用结果,所以第一次调用的结果将始终是你的主要的a和b之间的较小数字。您需要使用递归调用的结果来使函数正常工作。
  3. 正确的方法是返回你的递归调用结果,如Sanjay-sopho已经说过:

    return gcd(a,b);
    

    另外,在else上的if和no大括号上使用大括号是不好的编码风格;)两种情况都很好,但保持相同。