2011-11-01 7 views
2

첫 번째 요소를 호출 할 때마다 목록의 끝으로 옮기는 기능을 작성하는 데 문제가 있습니다. reverse와 cdr의 조합을 사용하여 양쪽 끝에서 요소를 잘라내려고했지만 요소를 올바른 끝에 추가하는 방법을 알 수 없습니다. 어떤 도움을 주시면 감사하겠습니다. 감사!첫 번째 요소를 목록의 끝으로 옮깁니다. Scheme

정확한 결과 :

(first_to_last '(1 2 3))

(1 2 3)

(제 마지막에서 처음부터 마지막에 ('(1 2 3)))

(3 일 2)

+0

(reverse (cdr (reverse (cdr (reverse b)))))는 목록에서 첫 번째 요소와 마지막 요소를 제거 할 수 있지만 요소를 올바른 위치로 이동하는 방법을 알지 못합니다. . – user1023900

답변

1

난 당신이 개인적으로 반전을 과도하게 일을하는지 생각합니다.

우리가 원하는 것은 cdr xcar x이 끝에 붙어있는 목록입니다. 여기에 하나의 트릭은 car x가리스트되지 않는 것입니다, 그래서 우리는 그것을 추가하기 전에 목록에 변환 할 : 당신이 기본에 충실하고 싶었다면

(define (first-to-last x) (append (cdr x) (list (car x)))) 

cons은 넣어 정말 기본적인 방법입니다 것들을 함께 목록으로 만들었지 만 조금 더 많은 작업이 필요합니다. 기본적으로 append과 실질적으로 동일한 것을 정의하면 결국 cons이라고합니다. append이 이미 존재한다는 점을 감안할 때 매우 쉽지만 무의미합니다.

편집 : 나는 당신이 어떤 이유로 또는 다른위한 reverse을 사용하려는 경우, 당신은 같은 것을 할 수있을 것 같아요 :

(define (first-to-last x) (reverse (cons (car x) (reverse (cdr x))))) 

그것은 조금 더 그리고 같은 종류의 서투른 나 파업을하지만,로한다고 어쨌든 작동합니다.

+0

고맙습니다. 이것은 훨씬 더 의미가 있습니다. 그래서 (앞의 마지막 요소를 첫 번째 요소로 옮기고) 이것의 반대 작업을 원한다면, 나는 같은 프로세스를하고 싶지만 마지막 함수를 사용하기를 원할 것입니다. – user1023900

+0

@ user1023900 : 네, 맞아요. 여기서 역전은 의미가있을 수 있습니다. 마지막에서 첫 번째는 (역방향 (처음부터 끝까지 (역 x)))입니다. 아마 그 일을하는 데 가장 효율적인 * 방법은 아니지만 정말 간단합니다. –

+0

점근 적으로, 하나의 역방향은 두 개의 역방향과 다르지 않습니다. –

관련 문제