代码之家  ›  专栏  ›  技术社区  ›  J Cooper

功能替代品?

  •  2
  • J Cooper  · 技术社区  · 16 年前

    当我继续学习函数式编程时,我来了 想知道我默认的“程序”方式是否还有其他选择 思考。更具体地说,我在看一个函数i 写的。它的作用是:

    Swap two elements of an unordered list of numbers, such that one of the elements  
     is now in the right place
    Add the sum of the swapped values to an accumulated total   
    Repeat until list is sorted
    

    所以,现在我用一个标准循环*和一个accum变量来做 以上。一切都很好,而且肯定没有什么问题 在现实生活中迭代,但作为这个练习的重点是 扩展我的思维方式,我很好奇是否有更实用的 接近上述算法。

    谢谢!

    *(实际上是递归,但无论如何)

    2 回复  |  直到 16 年前
        1
  •  1
  •   nlucaroni    16 年前

    EigenClass :

    尊敬的勒罗伊大师正和他的学生一起散步。学徒希望和他的师傅开始讨论,他说:“师傅,我听说所有的循环都必须用尾部递归函数替换。”是真的吗?”勒罗伊同情地看着他的学生,回答说:“愚蠢的学生,许多尾部递归函数只是无效的循环。”

    接下来的几周,学生用显式循环替换尾部递归函数。他终于向勒罗伊大师展示了他的密码,寻求他的认可。勒罗伊用棍子打他。”你什么时候学习?显式循环是一个可怜的人的尾巴递归函数。”这时,这个学生开悟了。

    编辑:参考OCAML的主要开发人员Xavier Leroy

    因为我不能 看见 我不知道你的功能是如何发挥作用的。但你所做的似乎是正确的。我的主要建议是寻找适合于函数式编程的数据结构——但是您使用的是列表,所以这是不可能的,尽管在这种情况下,列表不是最好的数据结构。以及算法。如果您习惯使用插入排序,那么您可能无法使用合并排序或其他更有效的方法。

        2
  •  1
  •   Brian    16 年前

    递归基本上是一种函数式编程机制。我想你可以用一个函数来替换交换函数,这个函数接受一个列表并返回一个列表或者类似的愚蠢的东西,但是如果不是用一种真正有用的语言来写,那将是一个坏主意。

    尝试在oz、sml、prolog或lisp中实现mergesort。例如,类似于用于合并的伪代码:

    Merge(A,[])=A
    Merge(H|T,H2|T2)=iif(H<H2,H|Merge(T,H2|T2),H2|Merge(H|T,T2)