【问题标题】:Finding permutations with foldl/map?使用 foldl/map 查找排列?
【发布时间】:2012-12-02 02:43:13
【问题描述】:

教授向我们展示了一种查找列表所有排列的冗长方法,即 (abc) => ((abc) (acb) (bac) (bca) (cba) (cab)),但她说使用 foldl 或 map 可以更有效地完成。

对功能性思维方式完全陌生。我这辈子都想不通。

【问题讨论】:

  • 您可能想澄清一下:您的教授的意思是“更高效”是指它会运行(渐近地)更快,还是“更高效”是指代码更少? Map 和 Foldl 几乎出现在 Scheme 中的每个列表迭代问题中,所以这个评论并不奇怪。

标签: map functional-programming scheme fold


【解决方案1】:

这个怎么样?

#lang racket    
(define l '(apple banana cheese desk))
(remove-duplicates (for/list ([i 1000000]) (shuffle l)))

当然,你会想要增加长列表的常数....

(#nothelpfulsorry)

【讨论】:

    【解决方案2】:

    http://rosettacode.org/wiki/Permutations#Scheme 上有方案版本(你提到了“foldl”,所以这个页面上也有 haskell 版本):

    (define (insert l n e)
      (if (= 0 n)
          (cons e l)
          (cons (car l) 
                (insert (cdr l) (- n 1) e))))
    
    (define (seq start end)
      (if (= start end)
          (list end)
          (cons start (seq (+ start 1) end))))
    
    (define (permute l)
      (if (null? l)
          '(())
          (apply append (map (lambda (p)
                               (map (lambda (n)
                                      (insert p n (car l)))
                                (seq 0 (length p))))
                         (permute (cdr l))))))
    

    【讨论】:

    • 问题是关于 Scheme,而不是 Clojure 或 LISP。编辑:另外,你没有使用 fold....
    • Haskell 版本使用的是 foldr,而不是 foldl(或 fold-left)... 为什么要提到 Haskell ???
    • @leppie 主题开始者提到了使用 foldl OR map 的解决方案。此外,示例有助于理解问题的功能方法,也可以应用于方案版本解决方案。
    • @leppie 我的错。只是没有注意到“方案”标签。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-02-20
    • 2020-09-25
    • 2010-09-22
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多