教授向我们展示了一种找出列表的所有排列的抽出方法,即(a b c)=> ((a b c)(a c b)(b a c)(b c a)(c b a)(c a b)),但她说用折叠或地图可以更有效地完成。
功能性思维方式全新。我无法想象我的生活。
答案 0 :(得分: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))))))
答案 1 :(得分:1)
这个怎么样?
#lang racket
(define l '(apple banana cheese desk))
(remove-duplicates (for/list ([i 1000000]) (shuffle l)))
当然,你需要增加长列表的常量....
(#nothelpfulsorry)