Хвостовая рекурсия в С - PullRequest
       4

Хвостовая рекурсия в С

2 голосов
/ 14 октября 2010

Я пытался написать рекурсивную функцию, чтобы найти факториал числа.

    int factorial(int input,int *answer)
    {
       if ( input ==0 )        
       {                       
        return 0;
       }

       *answer  = *answer * input;
       factorial(input -1, answer);
    }

Что вы скажете об этой функции?Хвост рекурсивен?

Ответы [ 2 ]

6 голосов
/ 14 октября 2010

При выполнении хвостовых рекурсивных функций (особенно хвостовых рекурсивных функций) часто полезно иметь вспомогательную функцию в дополнение к другой функции, которая имеет более дружественный интерфейс. Функция дружественного интерфейса на самом деле просто устанавливает аргументы менее дружественной функции.

static unsigned factorial_helper(unsigned input, unsigned acc) {
       if (intput == 0) {
           return acc;
       }
       return factorial_helper(input-1, acc * input);
}

unsigned factorial(int input) {
    if (input < 0) {
        do_something_bad();
    }
    return factorial_helper(input, 1);
}

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

4 голосов
/ 14 октября 2010

Вот ссылка с определением: http://phoenix.goucher.edu/~kelliher/cs23/feb21.html

"Функция является хвостовой рекурсивной, если самое последнее, что она делает, это делает свой рекурсивный вызов."

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...