2012-12-14 2 views
1

교수는 목록의 모든 순열을 찾아내는 방법을 보여주었습니다. 즉, (abc) => (abc) (acb) (bac) (bca) (cba) (택시) foldl 또는지도를 사용하면 훨씬 효율적으로 작업을 수행 할 수 있습니다.foldl/map을 사용하여 순열 찾기?

기능적 사고 방식에 완전히 새로운 기능입니다. 나는 내 인생에 대해 이것을 이해할 수 없다.

+0

(#nothelpfulsorry가) : 당신의 교수는 "보다 효율적인 의미 않았다 "코드가 적어지기 때문에 (점근 적으로) 더 빨리 또는"더 효율적으로 "실행된다는 의미에서? Map과 Foldl은 Scheme의 거의 모든 목록 반복 문제에서 빠져 나오므로 댓글은 놀라운 것이 아닙니다. –

답변

1

계획 버전 http://rosettacode.org/wiki/Permutations#Scheme에 (당신이 하스켈 버전이 페이지에 너무 그래서 거기에 "foldl"mensioned)가 있습니다 : 어떻게 하나에 대한

(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

하스켈 버전 foldl을 사용하지 foldl (또는 접이식 왼쪽) ... 그리고 왜 하스켈을 언급 ??? – leppie

+0

@leppie 주제 시동기가 foldl OR 맵을 사용한 솔루션에 대해 언급했습니다. 또한 예는 체계 버전 솔루션에도 적용 할 수있는 문제에 대한 기능적 접근을 이해하는 데 도움이됩니다. – mobyte

1

를? 당연히

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

, 당신은 긴 목록에 대한 상수를 증가 할 수 있습니다 ....

이 가

당신은 조금 명확히 할 수 있습니다