zoukankan      html  css  js  c++  java
  • Erlang高阶函数——递归

    说明

    Erlang 高阶函数(匿名函数)有一大堆资料,不再赘述,这里主要说以下高阶函数递归式。

    高阶函数递归用法

    高阶函数实现尾递归有两种方式:

    • 1、将高阶函数自身作为参数传入,并在内部调用
    • 2、通过fun进行类似普通函数的定义

    1、作为参数传入

    参考资料: (转)Erlang匿名函数的递归

    写普通函数的时候函数名确定(是原子),因此可以在函数内部调用自身,从而实现尾递归。但高阶函数不同,高阶函数在定义出来之前是未知的。所以通常情况下都是在定义时多传一个参数,在使用的时候将已经定义的函数自身传入。

    示例代码:

    Fun = fun
            (F, [], Total) -> 
                Total;  
            (F, [H|T], Total) -> 
                F(F, T, H+Total) 
          end.  

    2、类似普通函数进行定义

    这是群里的朋友交流的时候 @冰川 提出来的,在此之前还真不知道有这种用法。

    曾经想过可能会有,但再想到这种用法和Erlang的一贯做法不搭,就自我否定了。有没有是一回事儿,是否求证是另一回事儿,现在看来真是惭愧。

    示例代码:

    F = fun 
            Test([H | T], Total) -> 
                Test(T, H + Total); 
            Test([], Total) -> 
                Total 
        end.

    注:上面的用法怎么看都是面向对象,当然跟函数指针的用法也很像

    执行结果:

    Erlang/OTP 20 [erts-9.0] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]
    
    Eshell V9.0  (abort with ^G)
    1> F = fun Test([H | T], Total) -> Test(T, H + Total); Test([], Total) -> Total end.   
    #Fun<erl_eval.36.99386804>
    2> F([1,2,3,4,5,6,7,8], 0).
    36
    3> 

    附:
    OTP 20.0开始,不再支持命令 -smp disable关闭 smp 功能 ,而是改用 +S

    • 1、不再支持命令 -smp disable
    • 2、-smp enable|auto 仍然可以使用
    • 3、使用 +S 控制数量

    +S用法参考:

    http://erlang.org/doc/man/erl.html

    [Erlang 0035] Erlang SMP

    知识共享许可协议 本文由 qingchuwudi 原创/整理,除非另有声明,本作品采用知识共享署名 3.0 中国大陆许可协议进行许可。

  • 相关阅读:
    第七周作业
    人月神话之没有银弹
    第六周作业
    第五周作业
    第四周作业
    第三周作业
    人月神话之沟通
    第二周作业
    第一周作业
    第八周作业
  • 原文地址:https://www.cnblogs.com/qingchuwudi/p/12077722.html
Copyright © 2011-2022 走看看