2017-03-29 6 views
1

라켓에 익숙하며 목록이 엄격히 오름차순인지 확인하는 함수를 작성하려고합니다.라켓에서 목록의 오름차순 확인

'(1 2 3)가 true를 반환 '(1 2) (3 2 4) 반환 ' 을 거짓 (반복) 반환 거짓

내 코드는 지금까지 있습니다 : Image of code

(define (ascending? 'list) 
    (if (or (empty? list) (= (length 'list) 1)) true 
     (if (> first (first (rest list))) false 
      (ascending? (rest list))))) 

오름차순 전화를하려고합니까? 재귀 적으로 내 기본 경우는 목록이 비어 있거나 요소가 하나 뿐인 경우입니다 (그 다음에는 오름차순).

"application : not a procedure"라는 check-expect를 사용할 때 오류 메시지가 계속 나타납니다. 함수를 작성할 때

+0

코드의 이미지를 게시하지 마십시오; 실제 질문에 코드를 입력하십시오. –

+0

좋아요, 그냥 위에 게시했습니다! – Vic

답변

2

몇 가지 고려해야 할

  • 피가 변수 이름과 같은 기능을 내장하여. 예를 들어 list은 새로 할당 된 목록을 반환하는 내장 프로 시저이므로 함수의 인수 또는 변수로 사용하지 마십시오. 일반적인 규칙/대안은 lst을 목록의 변수 이름으로 사용하므로 (define (ascending? lst) ...) 일 수 있습니다.
  • 변수 이름을 인용하지 마십시오. 예를 들어 (define lst '(1 2 3 ...))이고 (define 'lst '(1 2 3 ...))이 아닐 경우
  • 테스트 조건이 여러 개 (예 : 2 개 이상) 인 경우 여러 개의 if 문을 중첩하지 말고 cond을 사용하는 것이 더 깔끔할 수 있습니다.

은 ('list 교체 후) ascending?의 구현을 수정하면 (> first (first (rest list)))이 경우 3 행에 유의하십시오. 여기서 first(first (rest list))으로 비교하지만 실제로 원하는 것은 (first lst)(first (rest lst))을 비교하면 (>= (first lst) (first (rest lst)))이어야합니다.

(define (ascending? lst) 
    (cond 
    [(null? lst) #t] 
    [(null? (cdr lst)) #t] 
    [(>= (car lst) (cadr lst)) #f] 
    [else 
    (ascending? (cdr lst))])) 

또는 true/falsefirst/rest를 사용하려는 경우, 당신이 할 수 있습니다 : 예를 들어

(define (ascending? lst) 
    (cond 
    [(empty? lst) true] 
    [(empty? (rest lst)) true] 
    [(>= (first lst) (first (rest lst))) false] 
    [else 
    (ascending? (rest lst))])) 

,

> (ascending? '(1 2 3)) 
#t 
> (ascending? '(1 1 2)) 
#f 
> (ascending? '(3 2 4)) 
#f 
+0

중첩 된 cond는 중첩 된 if보다 훨씬 의미가 있습니다. 그리고 다른 팁에도 감사드립니다 !! – Vic

3

내가 당신을 추측 여기

은 샘플 구현 처음부터 프로 시저를 구현하고 싶습니다. Alexander의 대답은 사실입니다. 그러나 실제 함수형 프로그래밍 스타일에서는 솔루션을 작성하기 위해 기존 프로 시저를 재사용해야합니다. 이것이 내 뜻입니다.

(define (ascending? lst) 
    (apply < lst)) 

더 간단하고 이해하기 쉽습니다. 그리고 예상대로 작동합니다!

(ascending? '(1 2 3)) 
=> #t 

(ascending? '(1 1 2)) 
=> #f 
+2

는 아름다워 보인다 :) – AsheKetchum

+1

굉장하고, 대단히 감사한다! – Vic

0

이 계획 솔루션을 사용하는 명시 적으로 재귀 이름 letmemoization :

(define (ascending? xs) 
    (if (null? xs) #t     ; Edge case: empty list 
     (let asc? ((x (car xs))   ; Named `let` 
       (xs' (cdr xs))) 
     (if (null? xs') #t 
      (let ((x' (car xs')))  ; Memoization of `(car xs)` 
       (if (< x x') 
        (asc? x' (cdr xs')) ; Tail recursion 
        #f))))))    ; Short-circuit termination 

(display 
    (ascending? 
     (list 1 1 2)))     ; `#f` 
0

당신이 총알 형태의 오름차순 목록의 속성을 작성하는 경우;

어느

  • 빈리스트가
    • 첫 번째 요소는 작은 또는
    • 한 요소 목록 또는
    • 리스트 인 상승리스트이고 제 2 원소보다,
    • 리스트의 꼬리는 꽤 똑바로 번역 바람 수

을 오름차순입니다 :

(define (ascending? ls) 
    (or (null? ls) 
     (null? (rest ls)) 
     (and (< (first ls) (first (rest ls))) 
      (ascending? (rest ls)))))