【问题标题】:How to flatten a list without recursion ocaml?如何在没有递归ocaml的情况下展平列表?
【发布时间】:2015-10-06 05:01:37
【问题描述】:

如何在 ocaml 中将整数列表扁平化为单个整数列表?该功能将如下所示工作。

[[1;2];[3;4;5];[];[6]] -> [1;2;3;4;5;6]

因为这是作业,所以只能使用 fold_left 或 fold_right 来完成,不能使用 '@' 运算符,也不能使用递归。我知道累加器将成为新列表的成员,但我不知道如何将原始列表的元素实际移动到累加器。任何提示将不胜感激。

【问题讨论】:

    标签: functional-programming ocaml fold flatten


    【解决方案1】:

    这里有一些提示:

    一个。将值移动到累加器并不困难。如果你的值是x,你的累加器是a,你可以写x :: a

    b.您主要需要以一致的顺序处理所有内部值。这就是折叠的用途。

    c。折叠用于处理列表的元素。但是你有一个列表列表。

    【讨论】:

      【解决方案2】:
      List.fold_left (fun liRes la -> 
        List.fold_right ( fun iRes la ->
          iRes::la    
        ) liRes la
      ) [] [[1;2];[3;4;5];[];[6]]
      

      结果:

      - : int list = [1; 2; 3; 4; 5; 6]
      

      其他形式:

      let (@) =
        List.fold_right ( fun iRes la ->
          iRes::la
        );;
      
       List.fold_left (fun liRes la -> 
         liRes @ la
       ) [] [[1;2];[3;4;5];[];[6]];;
      

      你可以试试:

      # []@[1;2];;
      - : int list = [1; 2]
      # (@) [1;2] [3;4];;
      - : int list = [1; 2; 3; 4]
      

      【讨论】:

      • (我不确定为某人的家庭作业问题提供代码是否有帮助。)
      猜你喜欢
      • 1970-01-01
      • 2011-12-29
      • 1970-01-01
      • 2022-12-05
      • 1970-01-01
      • 1970-01-01
      • 2020-05-04
      • 2017-05-28
      相关资源
      最近更新 更多