Управление хвостовой рекурсией Erlang

У меня есть сомнения, мне нужно выполнить хвостовую рекурсию для этой pow-функции:

pow(_, 0) -> 1;
pow(N, X) when X > 0 -> N * pow(N, X - 1).

Я читал об этом, но не совсем понимаю. Может ли кто-нибудь объяснить мне, как использовать эту функцию в хвостовой рекурсии?


person Luiz Miranda    schedule 13.11.2017    source источник


Ответы (1)


В основном в хвостовой рекурсии вам нужен еще один параметр, который действует как аккумулятор.

%% So the first step is to convert the pow function to the pow_tail function, and initialize the accumulator to the default value. 

pow(N, X) -> pow_tail(N, X, 1);

%% Defined the base case for the pow_tail, to return the accumulator

pow_tail(_, 0, ACC) -> ACC;

%% Write the pow_tail function and store the result in the accumulator

pow_tail(N, X, ACC) when X > 0 -> pow_tail(N, X-1, ACC * N);

Надеюсь, это даст вам представление о том, как это можно сделать.

person JCorcuera    schedule 13.11.2017
comment
Спасибо, я действительно понял, как сделать хвостовую рекурсивную функцию. - person Luiz Miranda; 13.11.2017