首页 > 代码库 > Erlang练习题----shopping
Erlang练习题----shopping
直接就上代码了:
-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.
上面这段代码使用了迭代结构(recursive),但是,这种迭代结构存在问题,如果我们输入的T list太长的话,它会吃掉我们很多很多的内存。怎么办?聪明的先驱们已经想好了解决办法,有种叫tail recursive的方法,如下:
-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).
我们看到这里事实上有两个total函数,而且我们export的是只有一个参数的total函数:第一个只有一个参数,即我们如数的“商品-数量”的list,它是作为一个“伪装”,方便我们调用第二个total;而第二个total,有两个参数,其中一个是list,另一个则是用来暂存迭代值的临时变量。显然,如果使用这种迭代结构,每次迭代我们只需传递并保存两个参数,而不是一个待计算的表达式,这大大的节省了ram。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。