教授向我們展示了一個查找列表的所有排列的抽象方法,即(abc)=>((abc)(acb)(bac)(bca)(cba)(cab)),但是她說了可以通過foldl或map更高效地完成。查找foldl/map排列?
全新的功能思維模式。我無法弄清楚我的生活。
教授向我們展示了一個查找列表的所有排列的抽象方法,即(abc)=>((abc)(acb)(bac)(bca)(cba)(cab)),但是她說了可以通過foldl或map更高效地完成。查找foldl/map排列?
全新的功能思維模式。我無法弄清楚我的生活。
有計劃的版本(你mensioned 「與foldl」 所以Haskell的版本太多此頁)上http://rosettacode.org/wiki/Permutations#Scheme:
(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)
你可能想澄清一點:你的意思是教授「更有效「從某種意義上說,它會運行(漸近)更快,或者」更高效「,因爲它會減少代碼? Map和Foldl在Scheme中幾乎列出了每個列表迭代問題,因此評論並不令人意外。 –