递归与尾递归

现在在erlang中经常会看到递归。参考下许多网友的意见。

先看下erlang递归和尾递归的区别,如下例子:

[plain]  view plain  copy
 
  1. % 递归  
  2. loop(0) ->   
  3.     1;   
  4. loop(N) ->   
  5.    N * loop(N-1).  
  6.   
  7. % 尾递归  
  8. tail_loop(N)->   
  9.     tail_loop(N, 1).  
  10.   
  11. tail_loop(0, R)->   
  12.     R;   
  13. tail_loop(N, R) ->   
  14.     tail_loop(N-1, N *R).   

不难看出,erlang尾递归是通过参数来传递实际结果。普通递归用到的栈空间和列表的长度成正比,尾递归不需要再次申请栈空间。如果递归的次数过多,显然尾递归比较合适。至于说哪个递归速度快,erlang说法有争议

It depends. On Solaris/Sparc, the body-recursive function seems to be slightly faster, even for lists with very many elements. On the x86 architecture, tail-recursion was up to about 30 percent faster.


你可能感兴趣的:(erlang,递归,计算机)