【问题标题】:C Recursive Function - GCDC 递归函数 - GCD
【发布时间】:2016-12-06 11:05:29
【问题描述】:

我最近开始学习 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;
}

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

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

【问题讨论】:

  • 为什么递归函数中的局部变量是static?他们不应该。
  • if(c!=0) 分支没有返回值。
  • 而对gdc的调用会丢弃返回值。

标签: c recursion


【解决方案1】:

问题在于递归调用:

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 没有返回语句。您的函数必须返回 int。通常编译器会给你一个警告,因为你会返回一个随机数see here。因此,假设您的函数与 else 一起工作是幸运的。
  2. 如果没有 else 语句,您将总是返回 a。您计算 gcd 但您永远不会使用结果,因此第一次调用的结果将始终是 main 的 a 和 b 之间的较小数字。您需要使用递归调用的结果来使函数正常工作。

正确的方法是像 Sanjay-sopho 所说的那样返回递归调用的结果:

return gcd(a,b);

此外,在 if 上使用大括号而在 else 上不使用大括号是不好的编码风格;)两种情况都可以,但要保持相同。

【讨论】:

    【解决方案2】:

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

     static int c;
    

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

     gcd(a,b);
    

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

    现在是正确的方法,

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

    就是这样。

    【讨论】:

    • 那个静态实际上是我之前尝试过的其他东西的遗留物。真没想过要删。另外,我只是使用 gcd(a,b) 来完成欧几里得算法。只需遍历并分配值,然后在 c(余数)变为 0 时停止递归并返回 a。就像我说的那样,C 语言很新,递归更是如此。
    猜你喜欢
    • 2019-12-14
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多