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

Erlang练习题----shopping

时间:2014-05-02 12:58:19      阅读:280      评论:0      收藏:0      [点我收藏+]

标签:style   blog   class   code   java   javascript   

直接就上代码了:

bubuko.com,布布扣
-module(shop).
-export([cost/1,total/1]).

cost(orange) -> 5;
cost(newspaper) -> 8;
cost(apples)    -> 2;
cost(pears)     -> 9;
cost(milk)      -> 7.

total([{What, N}|T])  -> cost(What)*N + total(T);
total([])             -> 0.
bubuko.com,布布扣

上面这段代码使用了迭代结构(recursive),但是,这种迭代结构存在问题,如果我们输入的T list太长的话,它会吃掉我们很多很多的内存。怎么办?聪明的先驱们已经想好了解决办法,有种叫tail recursive的方法,如下:

bubuko.com,布布扣
-module(shop).
-export([cost/1,total/1]).

cost(orange) -> 5;
cost(newspaper) -> 8;
cost(apples)    -> 2;
cost(pears)        -> 9;
cost(milk)        -> 7.

total([{What, N}|T])     -> total([{What, N}|T], 0).

total([], Acc)            -> Acc;
total([{What, N}|T], Acc)    -> total(T, Acc + cost(What)*N).
bubuko.com,布布扣

我们看到这里事实上有两个total函数,而且我们export的是只有一个参数的total函数:第一个只有一个参数,即我们如数的“商品-数量”的list,它是作为一个“伪装”,方便我们调用第二个total;而第二个total,有两个参数,其中一个是list,另一个则是用来暂存迭代值的临时变量。显然,如果使用这种迭代结构,每次迭代我们只需传递并保存两个参数,而不是一个待计算的表达式,这大大的节省了ram。

Erlang练习题----shopping,布布扣,bubuko.com

Erlang练习题----shopping

标签:style   blog   class   code   java   javascript   

原文地址:http://www.cnblogs.com/pied/p/3703442.html

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