C 使非递归函数成为递归函数

C 使非递归函数成为递归函数,c,recursion,C,Recursion,gcd应该是一个递归函数。它应该是无效的。它应该取两个正整数,并将GCD放在第三个参数中 这是我的编码gcd函数。然而,我意识到它不是一个递归函数。如何更改此代码,使其成为递归函数 void gcd(int *x, int *y) { int i; getValuesForGCD(x, y); for (i = *x; i >= 1; i--) { if (*x % i == 0 && *y % i == 0) { printf("The G

gcd应该是一个递归函数。它应该是无效的。它应该取两个正整数,并将GCD放在第三个参数中

这是我的编码gcd函数。然而,我意识到它不是一个递归函数。如何更改此代码,使其成为递归函数

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

GCD自然定义为一个递归公式。它直接转换为递归函数:

gcd(a, 0) = a
gcd(a, b) = gcd(b, a % b)
C
格式写这个,就这样

int gcd(int a, int b) { 
   if (b == 0) 
   then return a
   else return gcd(b, a % b);
}
您应该注意到a和b必须是非负数

好的是,这是一个尾部递归,所以它的运行速度和非递归方法一样快。

通常,人们的工作是删除递归,而不是引入它

如果您希望将迭代算法的文字转换为递归算法,它将如下所示:

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);
}
要将迭代解决方案转换为递归,需要将每个循环转换为一个递归函数,该函数执行循环的一次迭代,然后为下一次迭代递归调用自身。中断循环对应于停止递归。在您的示例中,循环中断有两个原因:找到GCD或
i
达到零


请注意,这不是gcd的最佳算法,但它接受您提供的函数,并根据要求将其转换为递归函数。

将非递归函数转换为递归函数听起来不太实际。通常人们试图消除递归,而不是引入它。为什么要引入递归?为什么要引入指针?作为旁注,修改上面的算法,例如
i
start from min(x,y)。@raymondc当某些东西以递归方式更具可读性和自然性时,
gcd
就是其中之一。虽然,在这种情况下,它可能是一个硬件…我不知道这里发生了什么,但请停止破坏您的问题。我现在正在锁定这个,可以跑得一样快。只有当编译器执行TCO时才会发生这种情况。@通常,如果编译器不支持TCO,它通常也不支持递归(这意味着您不能执行递归方法)。BS。对递归的支持只需要一个堆栈来传递参数和返回地址,这通常内置在CPU中。在过去的30多年中,几乎每一个编译器都支持它,而且其中很多都不支持TCO。@QweRty别忘了在你的作业中给我评分。否则就是剽窃。