교수는 목록의 모든 순열을 찾아내는 방법을 보여주었습니다. 즉, (abc) => (abc) (acb) (bac) (bca) (cba) (택시) foldl 또는지도를 사용하면 훨씬 효율적으로 작업을 수행 할 수 있습니다.foldl/map을 사용하여 순열 찾기?
기능적 사고 방식에 완전히 새로운 기능입니다. 나는 내 인생에 대해 이것을 이해할 수 없다.
교수는 목록의 모든 순열을 찾아내는 방법을 보여주었습니다. 즉, (abc) => (abc) (acb) (bac) (bca) (cba) (택시) foldl 또는지도를 사용하면 훨씬 효율적으로 작업을 수행 할 수 있습니다.foldl/map을 사용하여 순열 찾기?
기능적 사고 방식에 완전히 새로운 기능입니다. 나는 내 인생에 대해 이것을 이해할 수 없다.
계획 버전 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))))))
를? 당연히
#lang racket
(define l '(apple banana cheese desk))
(remove-duplicates (for/list ([i 1000000]) (shuffle l)))
, 당신은 긴 목록에 대한 상수를 증가 할 수 있습니다 ....
이 가당신은 조금 명확히 할 수 있습니다
(#nothelpfulsorry가) : 당신의 교수는 "보다 효율적인 의미 않았다 "코드가 적어지기 때문에 (점근 적으로) 더 빨리 또는"더 효율적으로 "실행된다는 의미에서? Map과 Foldl은 Scheme의 거의 모든 목록 반복 문제에서 빠져 나오므로 댓글은 놀라운 것이 아닙니다. –