2017-10-31 12 views
0
(define (min list) 
(cond ((empty? (car list) '"It is empty")) <- Problem is here. Code work without this line. 
     ((empty? (cdr list)) (car list))   ;to check list is empty 
     ((< (car list) (min (cdr list))) (cdr list)) 
     (else (min (cdr list))))) 

저는 프로그래밍 언어를 배우기가 매우 어렵습니다. 나는 목록에서 최소한의 가치를 얻으려고 노력하고있다. 내가 넣을 때(), 프로그램이 내게 오류를 준다 : cdr : contract violation expected : pair? 주어진 : '(). 내가 여기서하려고하는 것은 인쇄하고 싶습니다. 사용자 유형()을 입력하면 비어 있습니다. Scheme 프로그래밍에서 그렇게 할 수 있습니까?사용자가 목록에 어떤 것을 넣지 않았는지 확인하는 방법은 무엇입니까? 체계적인 프로그래밍

+0

목록의 첫 번째 요소 ('car')가 비어 있는지 확인 하시겠습니까? 또는 목록이 비어 있는지 확인하고 싶습니까? 목록이 비어 있으면 목록에서 첫 번째 요소를 가져올 수 없습니다. 먼저 목록이 비어 있는지 확인해야합니다. 그리고 비어 있지 않으면 첫 번째 요소를 취할 수 있습니다. 예 :'(if (pair? some-list) (car some-list))'. 무언가가 쌍인 경우 첫 번째 요소를 사용할 수 있습니다. 그렇지 않으면. – ceving

답변

0

이 질문에 대한 답은 라켓 언어 개발자가 작성한 How To Design Programs, 2e의 교과서에서 찾을 수 있습니다.

이 경우 목록의 함수에 템플릿을 사용하고 싶습니다. 이것은 II 절, 특히 9.1 절에서 다룹니다.

0

Scheme 및 기타 Lisp 언어의 목록 구조는 cons-cell을 기반으로합니다.

  +-+-+     
     |1|----+    
     +-+-+ |    
       +-+-+   
       |2|---+   
       +-+-+ |   
         +-+-+  
         |3| |  
         +-+-+ 

최종 양론 셀의 각 단점 셀이 추천 목록의 다음 반대 셀에 값합니다 (car) 및 포인터 (cdr 뚜렷 투시 다르)이 포함 목록이 끝나고 nil을 포함합니다. 계획 표기법에서는 죄수 셀은 다음과 같습니다

(1 . 2) 

그래서 목록, 어떤 문법적하지 않고, 다음과 같이 보일 것이다 :

(1 . (2 . (3 . (4 . nil)))) 

빈 목록하는 단점 세포 구성되어 있습니다 다음과 같이 표시됩니다.

(nil) 

빈 목록에 car이 없습니까? 빈 목록이 있도록하는 무기 호처럼 취급 :

(1 . (2 . (3 . (4 .())))) 

작품을 그냥 이전처럼.

(1 2 3 4) 

그러나 기본 구조는 동일합니다 : 당신은 문법 설탕을 사용하는 경우

이제,리스트는 다음과 같습니다. 따라서 빈 목록이 있는지 테스트하려면 nil인지 테스트하십시오 (Scheme은 empty? 함수를 사용합니다). 따라서 목록의 차에서 empty?을 호출하는 대신 잘못된 생각과 오류가있는 목록에서 호출하십시오. 제 2 암이 댓글이 말한대로 목록이 비어 있음을 하지 검사를 수행하는 것이

(define (min list) 
(cond ((empty? list "It is empty")) 
     ((empty? (cdr list)) (car list)) 
     ((< (car list) (min (cdr list))) (cdr list)) 
     (else (min (cdr list))))) 

공지 사항 : : 그래서 당신의 기능은 다음과 같은 모양 목록이 하나 또는없는 요소가있는 경우는 확인합니다. cdr이 비었지만 차가 (두 번째 팔이 허용하는) 차가 아닌 경우, 하나의 요소 목록이 있습니다.

(foo .()) 

희망이 있습니다.

특정 기능을 향상시키는 방법에 대한 자세한 내용은 Oscar Lopez's answer to this question을 참조하십시오.

0

빈 목록을 인쇄하거나 최소값을 얻으려고한다고 생각합니까?

(define (min list) 
     (if (null? list) 
      "It's empty." 
      (let loop ([loop_list list] 
        [min_value (car list)]) 
      (if (null? loop_list) 
       min_value 
       (loop 
       (cdr loop_list) 
       (if (< min_value (car loop_list)) min_value (car loop_list)))))))