【问题标题】:Comparing arrays elements in Erlang比较 Erlang 中的数组元素
【发布时间】:2011-12-16 12:53:42
【问题描述】:

我正在尝试学习如何以函数式编程方式进行思考,为此,我正在尝试学习 Erlang 并从 codebat 解决简单的问题。我遇到了比较列表中元素的常见问题。例如,将第 i 个位置元素的值与列表的第 i+1 个位置的值进行比较。所以,我一直在思考和搜索如何在 Erlang(或任何函数式语言)中以函数式方式做到这一点。

请对我温柔一点,我是这个功能世界的新手,但我想学习

提前致谢

【问题讨论】:

    标签: erlang


    【解决方案1】:

    定义一个列表:

    L = [1,2,3,4,4,5,6]
    

    定义一个函数f,它接受一个列表

    • 如果匹配一个元素的列表或空列表,则返回空列表
    • 如果它匹配第一个元素和第二个元素,则获取第一个元素并通过递归调用列表的其余部分来构造一个新列表
    • 否则跳过列表的第一个元素。

    在 Erlang 代码中

    f ([]) -> [];
    f ([_]) -> [];
    f ([X, X|Rest]) -> [X | f(Rest)];
    f ([_|Rest]) -> f(Rest).
    

    应用功能

    f(L)
    

    这应该可以工作...尚未编译并运行它,但它应该可以帮助您入门。此外,如果您需要对其进行修改以使其表现不同。

    欢迎来到 Erlang ;)

    【讨论】:

      【解决方案2】:

      我尽量保持温和 ;-) 所以函数式方法的主要内容是思考:什么是输入?应该输出什么?没有什么比单独比较第 i 个元素和第 i+1 个元素更重要的了。它必须始终有目的,这将导致数据转换。即使是Mazen Harake 的例子。在此示例中,有一个函数仅返回后跟相同值的元素,即过滤给定列表。通常有非常不同的方式来做类似的事情,这取决于它的目的。 List 是基本的函数结构,你可以用它来做一些令人惊奇的事情,就像 Lisp 向我们展示的那样,但你必须记住它不是数组。

      每次您需要访问可重复的第 i 个元素时,这表明您使用了错误的数据结构。您可以在 Erlang 中构建不同的数据结构形式的列表和元组,这可以更好地满足您的目的。因此,当您遇到将 i-th 与 i+1-th 元素进行比较的问题时,您应该停下来思考。它的目的是什么?您是否需要像Mazen Harake 那样执行一些 数据转换,或者您需要随机访问?如果是第二个,您应该使用不同的数据结构(例如array)。即使这样,您也应该考虑您的任务特征。如果您将主要阅读而几乎从不写作,那么您可以使用list_to_tuple(L),然后使用element/2 阅读。当您偶尔需要写入时,您会开始考虑将其划分为多个元组,并且随着写入率的增长,您最终会使用 array 实现。

      所以你可以使用lists:nth/2,如果你只做一次或几次但在短名单上,你不像我那样表现怪癖。您可以使用[X1,X2|_] = lists:nthtail(I-1, L) 改进它(L = lists:nthtail(0,L) 按预期工作)。如果您面临更大的列表并且想要多次调用它,则必须重新考虑您的方法。

      P.S.:除了列表和树之外,还有许多其他有趣的数据结构。以拉链为例。

      【讨论】:

        猜你喜欢
        • 2012-11-25
        • 2016-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-13
        • 2015-07-28
        • 1970-01-01
        相关资源
        最近更新 更多