[英]My recursive greatest common denominator function isn't working properly
我正在嘗試使用遞歸創建一個 GCD(最大公分母)function。 我不明白為什么它不能正常工作。 對於輸入 10 和 50 返回 36。
這是我的代碼:
int main()
{
printf("Rez=%d ", gcd(10,50));
return 0;
}
int gcd(int a, int b)
{
static int n=0;
int result=1;
n++;
if(a<=1 || b<=1)
return 1;
else
{
if(a%n==0 && b%n==0)
result=n* gcd(a/n,b/n);
else
gcd(a,b);
}
return result;
}
使用 static 變量是一個問題,因為您以n * gcd(...)
的形式使用它,並且 n 的值不應與遞歸使用的值相同。 所以你應該傳遞一個參數。 您還應該添加一個條件以在 n 大於較小項時停止:
#include <stdio.h>
int main()
{
printf("%d\n", gcd(10, 50, 1)); //==>10
printf("%d\n", gcd(7, 35, 1)); //==>7
printf("%d\n", gcd(8, 22, 1)); //==>2
printf("%d\n", gcd(49, 5, 1)); //==>1
printf("%d\n", gcd(0, 0, 1)); //==>1
printf("%d\n", gcd(4, 2, 0)); //==>0
return 0;
}
int gcd(int a, int b, int n)
{
if (n <= 0) return 0;
if (n > (a < b ? a : b) || a<=1 || b<=1) return 1;
else if(a%n==0 && b%n==0) return n * gcd(a/n, b/n, n+1);
else return gcd(a, b, n+1);
}
static 變量是錯誤的原因。 在
result=n* gcd(a/n,b/n);
n
在調用遞歸之后計算。 因此,當您調用gcd( 5/5, 25/5 )
時遞歸停止並且n
通過該調用遞增到 6,您只需 6 * gcd( 10/1, 50/1 ) = 6 * 6 * gcd( 10/2, 50/2) = 6 * 6 * 6 = gcd(5/5, 25/5) = 6 * 6 * 6 * 1 = 216
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.