преобразовать рекурсию в 'хвостовую рекурсию'

У меня есть вопрос о том, как преобразовать «рекурсию» в «хвостовую рекурсию». это не домашнее задание, просто всплыл вопрос, когда я попытался откорректировать теорему рекурсии из книги алгоритмов. Я знаком с 2 типичными примерами использования рекурсии (факториала и последовательности Фибоначчи), а также знаю, как реализовать их рекурсивным способом и хвостовой рекурсией. Мой код, как показано ниже (я использую Perl просто, чтобы сделать его простым, но может быть легко преобразован в C / Java / C ++)

#this is the recursive function
sub recP    {
    my ($n) = @_;
    if ($n==0 or $n==1 or $n==2)    {
        return 1;
    } else {
        return (recP($n-3)*recP($n-1))+1;
    }

}
for (my $k=1;$k<10;$k++) {
    print "*"x10,"\n";
    print "recP($k)=", recP($k), "\n";
}

При запуске кода вывод, как показано ниже:

recP(1)=1 
recP(2)=1 
recP(3)=2 
recP(4)=3 
recP(5)=4 
recP(6)=9 
recP(7)=28 
recP(8)=113 
recP(9)=1018 

рекурсивная функция дважды вызывает себя с другим параметром перед возвратом; Я попробовал несколько способов преобразовать это в хвостовую рекурсивную форму, но все оказалось не так.

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

Ответы на вопрос(5)

Ваш ответ на вопрос