教授向我们展示了一种查找列表所有排列的冗长方法,即 (abc) => ((abc) (acb) (bac) (bca) (cba) (cab)),但她说可能是使用 foldl 或 map 可以更有效地完成。
对功能性思维方式来说是全新的。我这辈子都想不通。
教授向我们展示了一种查找列表所有排列的冗长方法,即 (abc) => ((abc) (acb) (bac) (bca) (cba) (cab)),但她说可能是使用 foldl 或 map 可以更有效地完成。
对功能性思维方式来说是全新的。我这辈子都想不通。
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))))))
这个怎么样?
#lang racket
(define l '(apple banana cheese desk))
(remove-duplicates (for/list ([i 1000000]) (shuffle l)))
自然,您会希望增加长列表的常数....
(#nothelpfulsorry)