我的函数“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;
}