据我所知,这里的逻辑是有道理的。然而输出是不正确的,我似乎可以理解它。
#include <stdio.h>
int gcd(int, int);
int main()
{
int n, m;
printf("enter two numbers");
scanf("%d%d", &n, &m);
printf("The gcd of %d and %d is: %d \n", n, m, gcd(n,m));
return 0;
}
int gcd(int x, int y)
{
while(x!=y){
if(x>y)
return (x-y,y);
else
return(x,y-x);
}
return x;
}
答案 0 :(得分:2)
这不是gcd
的递归实现,该函数不会调用自身,而且它使用while
循环。一个真正的递归方法将如下所示:
int gcd(int x, int y) {
if (y == 0)
return x;
else
return gcd(y, x % y);
}
或者更短一些:
int gcd(int x, int y) {
return y == 0 ? x : gcd(y, x % y);
}
上述实现基于欧几里德算法,有关详细信息,请参阅this。
答案 1 :(得分:1)
return (x-y,y);
只会返回y
。该代码编译,但可能不符合您的预期。
非递归Euclid GCD算法如下所示:
int gcd (int x, int y)
{
while (y != 0)
{
int r = x % y;
x = y;
y = r;
}
return x;
}
与递归版本相比:
int gcd (int x, int y)
{
return y == 0 ? x : gcd (y, x%y);
}
在这些简单的例子中,递归方法使用的源代码较少,但效率很低。
x
和y
的副本加上返回地址在堆栈上传递,而线性版本只对r
的剩余部分使用中间变量x / y
即使某些编译器可能足够聪明,可以检测到不必要的递归并对其进行优化,但我认为理解递归编码的固有成本是有用的。