나는 Scheme에서 순열을 만드는 다음 코드 조각을 발견했습니다.순열을 사용하여 재귀를 사용하여
(define (remove x lst)
(cond
((null? lst) '())
((= x (car lst))(remove x (cdr lst)))
(else (cons (car lst) (remove x (cdr lst))))))
(define (permute lst)
(cond
((= (length lst) 1)(list lst))
(else (apply append(map(lambda (i) (map (lambda (j)(cons i j))
(permute (remove i lst))))lst)))))
첫 번째 함수의 제거, 단지를 없애는 것이 간단한 것 : 나는 주장처럼 입력하면 I (1 2 3)이 나에게 줄 것 '을 의미 :은 다음
((1 2 3) (1 3 2) (2 1 3) (2 3 1) (3 1 2) (3 2 1))
코드입니다 x에 의해 표시된 caracter의리스트는리스트의 시작 부분과 비교하고 나머지 부분과 함께 재귀 적으로 호출함으로써 반복된다.
내가 얻지 못하는 부분은 permute 함수입니다. 내가 아는 한 map은 인수 (이 경우 목록)의 모든 요소에 함수를 적용하고 apply는 한 인수를 모든 인수에 완전히 적용합니다. 그래서 정확히이 라인 무엇을하고 있는지 : i와 j를, 우리가 걸릴 경우 그들은 (순열 요소와 목록해질 것이다 : 나를 위해
(apply append(map(lambda (i) (map (lambda (j)(cons i j))
(permute (remove i lst))))lst)))))
을 두 요소 쌍을 만들려고 것 같다 리스트는 단지 한 묶음의 연결 쌍임). 그러나 다시 말하자면, 나는 그 부분이 무엇을하고 있는가? 요소의 수가 없어 질 때까지 고정 된 요소 i의 쌍을 갖는 목록의 하위 집합을 생성하기 위해 목록의 헤드를 제거하는 것일뿐입니다.
어떤 도움이 필요합니까?
감사
람다없이 할 수있는 방법이 있습니까? – Deesha