码迷,mamicode.com
首页 > 其他好文 > 详细

Erlang点滴--try语句里的尾递归

时间:2014-08-22 01:33:15      阅读:392      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   使用   ar   2014   art   

像Erlang这种函数式编程语言,尾递归的使用对于减少栈开销是很重要的。尽管Erlang并不提倡防御式编程,但仍然提供了 try ... of ... catch ... after ... end 语句。这里有个需要注意的地方:try 语句模块里面的函数调用有可能无法形成尾递归。

下面是一个小实验:

 1 -module(test).
 2 -compile(export_all).
 3 
 4 -define(LOOP_CNT, 10000000).
 5 
 6 start_loop() ->
 7     timer:tc(fun loop/1, [?LOOP_CNT]).
 8 loop(N) when N =< 0 ->
 9     erlang:process_info(erlang:self(), stack_size);
10 loop(N) ->
11     loop(N-1).
12 
13 start_try_loop() ->
14     timer:tc(fun try_loop/1, [?LOOP_CNT]).
15 try_loop(N) when N =< 0 ->
16     erlang:process_info(erlang:self(), stack_size);
17 try_loop(N) ->
18     try try_loop(N-1) catch _:_ -> void end.
19 
20 start_of_loop() ->
21     timer:tc(fun of_loop/1, [?LOOP_CNT]).
22 of_loop(N) when N =< 0 ->
23     erlang:process_info(erlang:self(), stack_size);
24 of_loop(N) ->
25     try N=N of _ -> of_loop(N-1) catch _:_ -> void end.
26 
27 start_catch_loop() ->
28     timer:tc(fun catch_loop/1, [?LOOP_CNT]).
29 catch_loop(N) when N =< 0 ->
30     erlang:process_info(erlang:self(), stack_size);
31 catch_loop(N) ->
32     try N=e of _ -> void catch _:_ -> catch_loop(N-1) end.

bubuko.com,布布扣

实验结果印证了一开始的观点,仔细想想理应是这样的。

Erlang点滴--try语句里的尾递归,布布扣,bubuko.com

Erlang点滴--try语句里的尾递归

标签:style   blog   http   color   使用   ar   2014   art   

原文地址:http://www.cnblogs.com/easymath3/p/3928396.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!