2016-09-14 3 views
0

Я пишу метод рекурсии для вычисления гипотезы collatz для последовательности положительных целых чисел. Однако вместо остановки вычисления, когда значение достигает 1, мне нужно его остановить, когда значение станет меньше или равно исходному значению. Я не могу понять, какое условие я должен внести в оператор if.C Рекурсивная гипотеза Collatz только до того, как значение меньше исходного целого

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 collatz (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; 
} 

Пожалуйста, обратите внимание, что я удалил две возвратные заявления от рекурсивных вызовов.