2016-12-06 89 views
0

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

现在经过一番磨练,我设法把它们合在一起。

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

现在由于某种原因,我不知道,该功能不工作没有“其他”。更特别的是这样的:

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

尽管与作业无关,我觉得我应该明白这里的问题是什么。作为新手,我会感谢任何和所有的帮助。

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

+0

为什么递归函数“static”中的局部变量?他们不应该。 –

+2

'if(c!= 0)'分支不返回值。 –

+1

并且调用'gdc'会丢弃返回的值。 –

回答

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. 在上述情况下,你没有return语句,如果c!=0。你的函数返回int。通常编译器会给你一个警告,因为你会返回一个随机数see here。所以,让我们说这是运气,你的功能与其他作品。
  2. 没有else语句你会总是返回a。你计算gcd,但你永远不会使用结果,所以你的第一次调用的结果将永远是你的main的a和b之间的较小数字。您需要使用递归调用的结果来使该函数正常工作。

正确的做法是返回像桑杰 - SOPHO的递归调用你的结果已经说过:

return gcd(a,b); 

此外,它是使用在牙齿矫正不良的编码风格的,如果和在其他没有大括号;)两种情况都很好,但保持一致。

0

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

static int c; 

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

gcd(a,b); 

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

现在正确的方法,

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

就是这样。

+0

这个静态实际上是我之前尝试过的其他东西的剩余物。没有真正想过去除它。 此外,我只是使用gcd(a,b)来通过欧几里德算法。只需遍历并赋值,然后在c(余数)变为0并返回a时停止递归。 就像我说的,对于C来说还是比较新的,而且对于递归更是如此。 –