Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个递归GCD函数正确吗?_C_Recursion - Fatal编程技术网

这个递归GCD函数正确吗?

这个递归GCD函数正确吗?,c,recursion,C,Recursion,对于我的程序来说,一切都可以完美地编译和运行。我必须编写一个递归GCD函数。然而,我使用了两个函数,gcdrescursive和gcd。我能把这段代码压缩成一个函数吗?这样我就不需要下面代码中的gcd函数了?或者我的代码是正确的,并且这两个函数都是必需的 void gcdRecursive(int *x, int *y, int i){ if (i >= 1) { if (*x % i == 0 && *y % i == 0) { printf(

对于我的程序来说,一切都可以完美地编译和运行。我必须编写一个递归GCD函数。然而,我使用了两个函数,gcdrescursive和gcd。我能把这段代码压缩成一个函数吗?这样我就不需要下面代码中的gcd函数了?或者我的代码是正确的,并且这两个函数都是必需的

void gcdRecursive(int *x, int *y, int i){
  if (i >= 1) {
    if (*x % i == 0 && *y % i == 0) {
        printf("The GCD of %d and %d is %d", *x, *y, i); 
    } 
    else {
        gcdRecursive(x, y, i - 1);
    }
  }
}
void gcd(int *x, int *y){
  getValuesForGCD(x, y);
  gcdRecursive(x, y, *x);
} 

是的,这是正确的,但它远不是最优的

编辑:尝试使用以下选项:

if (x > y) 
  gcd(x,y) = gcd(y, x);
if (y % x == 0)
  gcd(x, y) = x;
else 
  gcd(x, y) = gcd(x, y%x)

可以采用更紧凑的形式

int getGcd(int num1, int num2)
{
    int remainder;

    if(num2 != 0)
        remainder = (num1 % num2);
    return ((num2 == 0) ? num1: getGcd(num2, remainder));
}

您的
gcd
函数是一个专用于与输入环境交互的包装器:所有工作都发生在
gcdRecursive
中。计算最大公约数已经不需要它了。当然,程序通常需要某种IO安排才能发挥作用,但这与您正在进行的任何计算是分开的。请停止进行垃圾邮件编辑,只是为了解决您的问题。您可以以较少的操作(计算方面)递归计算gcd。请参阅我的编辑,以了解无法工作的替代解决方案。它需要第三个参数,如上面代码所示。您的代码足够了,但对于我当前的代码来说不可行…@QweRty您可以在拒绝建议之前尝试查找主题…