代码之家  ›  专栏  ›  技术社区  ›  Luiz Miranda

尾递归pow-Erlang

  •  2
  • Luiz Miranda  · 技术社区  · 7 年前

    我有一个疑问,我必须做一个 尾部递归 对于此pow功能:

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

    我已经读过了,但我不完全明白,有人能解释一下如何在尾部递归中使用这个函数吗?

    1 回复  |  直到 7 年前
        1
  •  7
  •   JCorcuera    4 年前

    基本上,在尾部递归中,您需要另一个充当累加器的参数。

    %% 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);
    

    希望这能给你一个办法。