Erlang递归

本文介绍了Erlang中的递归概念,通过一个递归演示例子展示了普通递归在处理大规模计算时可能导致大量内存消耗。接着讨论了尾递归的优势,它在递归调用作为函数末尾的唯一操作时能有效减少资源消耗。文章总结了线性递归与尾递归的差异,并提及使用LISTS:FOLDL/FOLDR作为更高效的选择,但强调实际项目中应考虑优化算法。
摘要由CSDN通过智能技术生成

Erlang递归

Erlang是一种函数式编程语言,需要记住的是所有函数式编程语言,它们不提供任何循环结构。 相反,函数式编程依赖于一种称为递归的概念。

编程语言中,函数Func(Type a,……)直接或间接调用函数本身,则该函数称为递归函数。递归函数不能定义为内联函数

递归demo1

测试递归和性能

tets(N) ->
  Result = sum(N),
  io:format("~p~n", [Result]),
  erlang:process_info(self()).

sum(1) ->
  1;
sum(N) ->
  N + sum(N - 1).

结果:

(gs_framework@192.168.77.41)5> lib_test:tets(100000000).
5000000050000000
[{current_function,{lib_test,tets,1}},
 {initial_call,{erlang,apply,2}},
 {status,running},
 {message_queue_len,0},
 {messages,[]},
 {links,[<0.55.0>]},
 {dictionary,[]},
 {trap_exit,false},
 {error_handler,error_handler},
 {priority,normal},
 {group_leader,<0.54.0>},
 {total_heap_size,237289198},
 {heap_size,237288211},
 {stack_size,25},
 {reductions,99951263},
 {garbage_collection,[{max_heap_size,#{error_logger 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
尾归是一种高效解决问题的思想,它可以避免归过程中的栈溢出问题。在Erlang中,由于没有循环语句,所以归是一种常见的编程方式。而尾归是一种特殊的归方式,它可以将归转化为循环,从而避免了归过程中的栈溢出问题。 在Erlang中,尾归函数的最后一步操作是归调用自身,并且归调用的结果直接返回给函数的调用者,而不是在归调用之后再进行其他操作。这样,就可以避免归过程中的栈溢出问题,因为每次归调用都会覆盖上一次调用的栈帧,从而减少了栈的使用。 举个例子,下面是一个计算阶乘的尾归函数: ``` facttail(N) -> facttail(N, 1). facttail(0, Acc) -> Acc; facttail(N, Acc) -> facttail(N-1, N*Acc). ``` 在这个函数中,第一个参数N表示要计算阶乘的数,第二个参数Acc表示当前的阶乘结果。函数的第一行调用了一个辅助函数facttail/2,并将Acc初始化为1。在辅助函数中,当N等于0时,直接返回Acc;否则,归调用facttail/2,并将N减1,Acc乘以N,作为下一次调用的参数。这样,每次归调用都会更新Acc的值,直到N等于0时,返回最终的阶乘结果。 总之,尾归是一种高效的归方式,可以避免归过程中的栈溢出问题。在Erlang中,尾归函数的最后一步操作是归调用自身,并且归调用的结果直接返回给函数的调用者。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值