1

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

对功能性思维方式来说是全新的。我这辈子都想不通。

4

2 回答 2

1

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))))))
于 2012-12-14T05:07:32.020 回答
1

这个怎么样?

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

自然,您会希望增加长列表的常数....

(#nothelpfulsorry)

于 2012-12-14T18:45:27.757 回答