【问题标题】:sml foldl explanation/tracesml foldl 解释/跟踪
【发布时间】:2012-10-17 16:08:27
【问题描述】:

我试图解决这个问题一段时间,但我没有成功。 以 [1,2,3] 的示例输入参数为例,以下函数 (powerset) 是如何详细进行的? 非常感谢您的帮助。

fun ps L = foldl (fn (x,tl) => tl @ map (fn xs => x::xs) tl) [[]] L;

【问题讨论】:

    标签: sml fold


    【解决方案1】:

    要正确使用该函数,您必须假设输入列表中没有重复。

    函数可以这样理解:

    • 我们从一个累加器开始,它是一组仅由一个空集 ([[]]) 组成的集合。
    • 在每一步中,我们获取累加器中的每个集合,将当前元素 x 添加到它们,并将这些结果添加到累加器中。
    • 最终结果是一组所有可能的n 元素集,即powerset

    为了方便表达痕迹,我们创建一个辅助函数f

    fun f (x, tl) = tl @ map (fn xs => x::xs) tl
    

    现在我们可以追踪到[1, 2, 3]

       ps [1, 2, 3]
    
    ~> foldl f [[]] [1, 2, 3] (* Step 1 *)
    ~> foldl f (f (1, [[]])) [2, 3]
    ~> foldl f ([[]] @ map (fn xs => 1::xs) [[]]) [2, 3]
    
    ~> foldl f [[], [1]] [2, 3] (* Step 2 *)
    ~> foldl f (f (2, [[], [1]])) [3]
    ~> foldl f ([[], [1]] @ map (fn xs => 2::xs) [[], [1]]) [3]
    
    ~> foldl f [[], [1], [2], [2, 1]] [3] (* Step 3 *)
    ~> foldl f (f (3, [[], [1], [2], [2, 1]])) []
    ~> foldl f ([[], [1], [2], [2, 1]] @ map (fn xs => 3::xs) [[], [1], [2], [2, 1]]) []
    
    ~> foldl f [[], [1], [2], [2, 1], [3], [3, 1], [3, 2], [3, 2, 1]] [] (* Step 4 *)
    
    ~> [[], [1], [2], [2, 1], [3], [3, 1], [3, 2], [3, 2, 1]] (* Final result *)
    

    【讨论】:

    • 非常感谢您抽出宝贵的时间,Pad!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多