2012-12-23 5 views
1

При моделировании проблемы Colatz Conjecture я сделал рекурсию, когда хочу напечатать номер счета в рекурсии. Я получаю результат, который мне нужен, но когда функция возвращает результат, она дает мне странные числа, почему что?3n + 1 странные вещи, происходящие

#include <stdio.h> 
#include <stdlib.h> 

int divide(int n,int count){ 

    if(n<=1){printf("%d ",count);return count;} 

    if(n%2==1){divide(n=3*n+1, ++count);} 
    else{divide(n/=2, ++count);} 
} 
int main(void) { 
    printf("%d ",divide(10,1)); 
    return 0; 
} 
+0

BTW: Я не думаю, что Collatz на самом деле разрешен. – wildplasser

ответ

8

Вы должны вернуться результатов рекурсивных вызовов:

if (n % 2) { return divide(3 * n + 1, count + 1); } 
//   %%%%%% 
else  { return divide(n/2, count + 1); } 

Обратите внимание, что нет никакого смысла в присвоении локальных переменные, так что я изменил, что простые вычисления.

+2

Я бы предложил добавить «-Wall» или подобное «предупредить все» в флагов компилятора. Это должно подобрать «не все пути имеют возвращаемое значение». –

10

У вас нет значения по умолчанию return. Таким образом, возвращаемое значение не определено.

3

A. Вам нужно вернуть возвращаемое значение из вызовов рекурсии.
B. Почему вы назначаете значение n в звонках, чтобы разделить?

#include <stdio.h> 
#include <stdlib.h> 

int divide(int n,int count){ 

    if(n<=1){printf("%d ",count);return count;} 

    if(n%2==1) 
    { 
     return divide(3*n+1, ++count); 
    } 
    else 
    { 
     return divide(n/2, ++count); 
    } 
} 
int main(void) { 
    printf("%d ",divide(10,1)); 
    return 0; 
} 
Смежные вопросы