2012-12-14 52 views
1

教授向我們展示了一個查找列表的所有排列的抽象方法,即(abc)=>((abc)(acb)(bac)(bca)(cba)(cab)),但是她說了可以通過foldl或map更高效地完成。查找foldl/map排列?

全新的功能思維模式。我無法弄清楚我的生活。

+0

你可能想澄清一點:你的意思是教授「更有效「從某種意義上說,它會運行(漸近)更快,或者」更高效「,因爲它會減少代碼? Map和Foldl在Scheme中幾乎列出了每個列表迭代問題,因此評論並不令人意外。 –

回答

1

有計劃的版本(你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)))))) 
+0

問題是關於Scheme,而不是Clojure或LISP。編輯:另外,你沒有使用摺疊.... – leppie

+0

哈斯克爾版本使用foldr,而不是foldl(或摺疊左)......爲什麼提到Haskell? – leppie

+0

@leppie主題發起人提到了有關foldl OR映射的解決方案。此外,示例還有助於理解可應用於方案版本解決方案的問題的功能方法。 – mobyte

1

這件怎麼樣?

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

當然,你會希望增加對長列表恆....

(#nothelpfulsorry)