Рекурсивная функция цепочки Коллатца C

Я пытаюсь создать некоторый код, который при задании начального числа пытается найти длину соответствующей цепочки коллатца.

Я надеялся сделать это рекурсивно, и это то, что у меня есть до сих пор:

#include stdio.h

int collatz(int number, int count)
{
    if(number == 1)
    {
        return count;
    }
    if(number%2==0)
    {
    number = number/2;
    collatz(number, count+1);
    }
    else
    {
    number = number*3+1;
    collatz(number,count+1);
    }
    return 0;
}

int main(void)
{
    int stored=0;
    int temp;
    for(int i = 1;i<10;i++)
    {
        temp = collatz(i,1);
        if(temp>stored)
        {
            stored = temp;
        }
    }
    printf("%i\n",stored);
}

Проблема, конечно, в том, что функция в конечном итоге достигает своей конечной точки, но затем возвращается как длина цепочки, и это становится новым числом.

Как я могу структурировать эту программу, чтобы, когда счет достигает своей конечной точки, я мог принять это значение в качестве вывода самого первого вызова?


person Amir    schedule 09.09.2014    source источник


Ответы (1)


Вам нужно вернуть результат рекурсивного вызова. Прямо сейчас вы игнорируете значение рекурсивного вызова и возвращаете 0. Каждый рекурсивный вызов должен выглядеть так:

return collatz(number, count+1);
person rob mayoff    schedule 09.09.2014
comment
Спасибо за ответ. Просто оставаясь в той же теме, это сработало отлично, но я немного смущен, почему я получаю ошибку сегментации, когда использую целые числа, но когда я заменяю все целые числа на «long long», все работает нормально. Ты знаешь почему? Я изменил переменную цикла, чтобы повторять до одного миллиона. - person Amir; 09.09.2014
comment
Что произойдет, если number станет нечетным числом больше 715 827 882? - person rob mayoff; 09.09.2014