2016-09-14 75 views
0

我正在寫一個遞歸方法來計算正整數序列的collat​​z猜想。但是,當數值達到1時不是停止計算,而是當數值變得小於或等於原始值時,我需要停止計算。我無法弄清楚我應該在if語句中加入什麼條件。C遞歸Collat​​z猜想,直到值小於原始整數

int collatz (int n) { 
    printf("%d%s", n, " "); 

    if(n > collatz(n)) { // here I would get an error saying all path leads to the method itself 
     return n; 
    } 
    else { 
     if(n % 2 == 0) { 
      return collatz(n/2); 
     } 
     else { 
      return collatz((3 * n) + 1); 
     } 
    } 
} 
+4

考慮傳遞兩個參數,例如, 'int collat​​z(int start,int n)'。 – user3386109

回答

1

我用兩個參數:

  1. 在startValue,通過遞歸調用的初始值和
  2. notFirstTime,判斷是否是第一次調用(而不是遞歸調用)。在這種情況下,值n < = startValue是允許的。

下面的代碼:

int collatz (int startValue, int n, int notFirstTime){ 
    printf("%d%s ", n, " "); 

    if(n <= startValue && !notFirstTime) 
    { // here I would get an error saying all path 
     //leads to the method itself 
     return n; 
    } 
    else 
    { 
     if (n%2==0) 
     { 
      collatz(startValue, n/2, 0); 
     } 
     else 
     { 
      collatz(startValue, (3*n)+1, 0); 
     } 
    } 
} 

int main() { 
    int x = 27; 
    int firstTime = 1; 
    int test = collatz(x,x, firstTime); 
    printf("\nLast value: %d\n", test); 
    return 0; 
} 

請注意,我刪除從遞歸調用兩個返回語句。