2017-11-02 11 views
1

나는 car, cdr 등의 계획과 아이디어에 새로운 점을 가지고 있습니다. 목록의 마지막 요소를 반환하는이 함수가 있지만, 지금은 그냥 빈 목록 만 반환합니다.계획표가 목록의 마지막 요소를 가져 오는 것

(define (last mylist) 
     (if (list? mylist) 
       (if (null? mylist) 
        (if (null? (cdr mylist)) 
         '() 
         (last (cdr mylist)) 
        ) 
      )   
    ) 
) 
+0

이제 아무 것도 얻지 못했습니다 –

+0

가장 안쪽의'if' 표현식에서'(null? (cdr mylist))'가 참이면 빈리스트 대신'(car mylist)'를 반환해야합니다.()'. – PieOhPah

답변

1

(null? mylist)이 표시되지 않는다면 무엇입니까? 비어 있지 않은 목록.

비어 있지 않은 목록에는 하나 이상의 요소가있을 수 있습니다.

얼마나 많은 요소가 마지막 요소가 첫 번째 요소일까요?

이러한 목록에 대한 내용은 무엇입니까? cdr? 이전에 재귀를 중지하려면이 값을 사용해야합니다. 지금은 목록이 비어있을 때까지 계속되지만 그보다 더 일찍 중지해야합니다. {1}에서

(define (last mylist) 
     (if (list? mylist) 
       (if (null? mylist) 
        '() 
        ;; {1} 
        (last (cdr mylist)) 
        ;; 
       ))) 

당신은 무조건 (last (cdr mylist))를 호출합니다. 그러나 당신이 당신의 명부의 끝에 도달하면 어떨까요? 요소가 하나만 남는다면 어떻게 될까요? 이 경우 결과로 을 반환해야합니다. 따라서 무조건 부 코드를 if 표현식으로 바꾸십시오.

+0

빈리스트를 얻는 이유를 이해합니다. 어떻게 수정해야할지 모르겠습니다. 우리는 작업 할 언어의 아주 작은 하위 집합을 받았다. –

+0

그것은 목록 –

+0

의 첫 번째이자 유일한 요소를 반환 할 것이고, 그것은 당신의 답이 될 것입니다 - 마지막 요소. 그냥 예제를 써라. 주어진'(3 2 1)','(null? lst)'은 무엇을 반환 할까? '(cdr lst)'은 무엇을 반환할까요? 그 결과를 계속 진행하고 싶습니까? '(2 1) '과 동일합니다. '(1)'에 대해서. 그것은 당신에게 결과를 줄 것이다. –

2

How To Design Programs 책은 구체적이고 세부적인 설계법을 제공하여이 문제를 해결할 수 있도록 도와줍니다. 이 특별한 문제는 9.2 절. "비어 있지 않은리스트"에서 다룹니다.

  • 이 함수
  • 의 목적 문, 서명 및 헤더 쓰기 비어 있지 않은 목록에 대한 데이터 정의를 수립 (또는 책에서 그것을 가지고) : 대체로, 여기 단계는 수행 할 필요가있다
  • 쓰기 테스트 케이스 (테스트 케이스는 여기 많은을 도울 것입니다. (당신은 당신의 데이터 정의에 의해 허용되지 않습니다 입력)
  • 이 템플릿과 관련된 추가 테스트 할 필요가 없습니다 명심 데이터 정의 (도서에도 표시됨)
  • 정의를 완료하려면 템플릿의 빈 공간을 채우십시오.
  • 디버그. 혼자 들여 쓰기으로
2

, 그것은 다른 프로그래밍 언어

에서 계획에오고있어하지만 당신은 또한 잘못 if을 사용하는 것이 매우 분명입니다 - 계획에서, 당신은 단일 지점을 가질 수 없습니다if 성명.음, 단지 표현if 표현은 항상 그에 (3 피연산자 (인수)

  1. 술어 (조건)
  2. 를 취할 것, 모든 계획에는 없다 무엇을 술어가 참일 경우 발생)
  3. 대체 (술어가 거짓 일 때 발생)

프로그램이 종료되었습니다. 약간의 조정 만하면됩니다. 바로 들여 쓰기로 인해 if의 3 개의 피연산자를 쉽게 볼 수 있습니다.

(define (last mylist) 
    (if (null? mylist) 
     #f 
     (if (null? (cdr mylist)) 
      (car mylist) 
      (last (cdr mylist))))) 

마지막으로, 계획은 조건이 답변의 범위를 넘어

(define (last mylist) 
    (cond ((null? mylist) 
     #f) 
     ((null? (cdr mylist)) 
     (car mylist)) 
     (else 
     (last (cdr mylist))))) 

(last '()) 
;; #f 

(last '(1)) 
;; 1 

(last '(1 2)) 
;; 2 

(last '(1 2 3)) 
;; 3 

의 시퀀스 중첩 불필요한 코드를 방지하는 데 도움이 cond(last '())에 대한 반환 값 #f입니다 제공 - 내가 주장이에 last를 호출 빈 목록은 빈 목록에 car을 호출하는 것과 동일한 효과를 가져야합니다. 그러나 나는 너에게 맡길거야.

0

나는이 초기 코드에 가장 가까운 생각 :

(define (last mylist) 
    (if (list? mylist) 
     (if (null? mylist) 
      '() ; input list is empty 
      (if (null? (cdr mylist)) 
       (car mylist) ; list only has one remaining element so this is it 
       (last (cdr mylist)))) ; otherwise, recurse 
     #f)) ; input is not a list 

if를 사용하여, 항상 작성해야 모두 사실거짓 분기합니다.

1

(null? (cdr mylist)) 질문을했을 때 '() 대신 true이면 (car mylist)을 반환해야합니다. 그 시점에서 그것은 mylist이 단일 원자 목록이라는 것을 의미합니다.

(define (last mylist) 
    (cond ((null? mylist) '()) 
     ((null? (cdr mylist)) (car mylist)) 
     (else (last (cdr mylist))))) 

당신은 if가 자주 조건 만 두 가지 옵션이 때 사용되는 동안 cond 많은 무기를 처리하기 때문에, 중첩 된 조건을 방지하기 위해 cond 대신 if로 사용할 수 있습니다.

이 책 the Little Schemer은 Scheme 프로그램에서 진행중인 작업을 시각화 할 수 있도록 도와주었습니다.