首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C/C++ 遞迴與迴圈錯誤修正:最大公約數函式

     編輯:程式設計綜合問答

原始錯誤程式碼

int f(int a, int b) {
    int temp;
    if (a > b) { temp = a, a = b, b = temp; } // 逗號運算子誤用
    while (a != 0)
        do { temp = a, a = b % a, b = temp; } // while 不需 do
    return b;
}

問題分析

  1. 逗號運算子濫用:temp=a, a=b, b=temp 雖語法合法,但可讀性極差,易導致邏輯錯誤。
  2. 多餘的 do-while:外層已有 while(a!=0),內層 do 導致結構混亂,實際僅需單層迴圈。
  3. 缺少大括號:單行陳述式建議加上大括號,避免維護時誤判。

修正後標準輾轉相除法

int gcd(int a, int b) {
    int temp;
    if (a > b) {
        temp = a;
        a = b;
        b = temp;
    }
    while (a != 0) {
        temp = a;
        a = b % a;
        b = temp;
    }
    return b;
}

更簡潔寫法(遞迴版)

int gcd_recursive(int a, int b) {
    return (b == 0) ? a : gcd_recursive(b, a % b);
}

測試範例

int main() {
    printf("%d\n", gcd(48, 18));        // 6
    printf("%d\n", gcd_recursive(48, 18)); // 6
    return 0;
}

總結

  • 避免在流程控制中濫用逗號運算子,改用區塊 {} 明確分隔陳述式。
  • 輾轉相除法核心邏輯:while (a) { int r = b % a; b = a; a = r; },最後 b 即為 GCD。
  • 遞迴版程式碼極短,但需注意堆疊深度(對 32 位整數極安全)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved