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;
}
}
}
答案 0 :(得分:6)
GCD自然被定义为复发公式。它直接转换为递归函数:
gcd(a, 0) = a
gcd(a, b) = gcd(b, a % b)
以C
格式写出来,就是这样。
答案 1 :(得分:2)
int gcd(int a, int b) {
if (b == 0)
then return a
else return gcd(b, a % b);
}
您应该注意到a和b必须是非负数。
而且好处是,这是一个尾递归,因此它的运行速度与非递归方法一样快。
答案 2 :(得分:1)
通常,人们会努力删除递归,而不是介绍它。
如果您希望迭代算法的文字转换为递归,则它将如下所示:
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的最佳算法,但它会根据您的要求提供您提供的功能并将其转换为递归。