我的函数“euclid”正确地计算了预期的返回值(if语句中的f2),但是当它在main中从调用返回时,“gcd=euclid(factor_1,factor_2);”是不正确的。
例如:以当前的#为因子,97,13,它应该返回1,这是f2等于的值,但是当我打印gcd时,它说它是0。
我的错误是什么?

int euclid(int f1, int f2);

int main()
{
    int factor_one = 97, factor_two = 13;
    int gcd;
    gcd = euclid(factor_one, factor_two);
    //gcd = factor_one % factor_two;
    printf("GCD = %d\n",gcd );
}

int euclid(int f1, int f2)
{
   if (f1%f2 == 0)
   {
        //printf("base case %d \n", f2);
        printf("GCD = %d\n",f2 );
        return f2;
   }
   else
   {
       int temp = f1%f2;
       //printf("%d\n", temp);
       euclid(f2, temp);
   }
}

最佳答案

将评论转换为答案。
您需要从递归调用返回值:return euclid(f2, temp);
您可能可以在条件之前使用int temp = f1 % f2;来简化代码;然后使用if (temp == 0) { … } else { return euclid(f2, temp); }
您应该只在euclid()函数中打印作为调试度量。
所提出的固定代码中的递归是尾递归。它可以被迭代替换。
给了圣人:
一般建议:使用-Wall打开编译器警告总是一个好主意。它会告诉你这个案例中的问题:warning: control reaches end of non-void function [-Wreturn-type]
这些建议产生了一个递归的解决方案:

int euclid(int f1, int f2)
{
    int temp = f1%f2;
    if (temp == 0)
    {
        //printf("base case %d \n", f2);
        //printf("GCD = %d\n",f2 );
        return f2;
    }
    else
    {
        //printf("%d\n", temp);
        return euclid(f2, temp);
    }
}

一个迭代解:
int euclid(int f1, int f2)
{
    int temp = f1%f2;
    while ((temp = f1 % f2) != 0)
    {
        f1 = f2;
        f2 = temp;
    }
    return f2;
}

09-04 07:20
查看更多