2012-09-23 4 views
3

저는 "The Little Schemer"제 4 판을 읽고 있습니다. 초기 연습은 목록에 주어진 값의 오른쪽에 값을 삽입하는 함수 insertR을 만드는 것입니다. 이 책은 결국 다음과 같은 정의에 도착 :cond 문에서 불필요한 것을 제거 하시겠습니까?

(define insertR 
    (lambda (new old lat) 
    (cond 
     ((null? lat) (quote())) 
     (else (cond 
       ((eq? (car lat) old) 
       (cons old 
        (cons new (cdr lat)))) 
       (else (cons (car lat) 
          (insertR new old 
            (cdr lat))))))))) 

내 자신의 정의는 다음과 같이 보았다 :

(define insertR 
    (lambda (new old lat) 
    (cond 
     ((null? lat) (quote())) 
     ((eq? (car lat) old) (cons old (cons new (cdr lat)))) 
     (else (cons (car lat) (insertR new old (cdr lat))))))) 

그들은 동일?

+1

나는 수색 엔진 중 하나에서 당신의 제목 (_ 다음과 같은 기능이 해당 _)을 검색 할 사람이 없다고 생각합니다 ... 개선 할 수 없습니까? – gdoron

+0

예, 당신 말이 맞습니다. 나는 그것을 희망이 있 더 나은 무언가에 바꿨다, 그것을 바꿀 자유롭게 느낀다. –

+0

어쨌든, gdoron의 힌트가 그의 열매를 줬습니다. 나는 지금 Little Schemer를 읽고 똑같은 것을 발견 한 사람을 찾았습니다. :) 그러나 누군가 다른 사람이 말했듯이 41 페이지에서 저자는 이런 종류의 단순화를 권장하는 것 같습니다. . –

답변

2

네가 쉽게 읽을 수 있지만 그렇다. cond복수 절을 지원하며 둘 중 하나가 true 값으로 평가 될 때까지 각각을 평가합니다. 따라서, 다음 : 아마도이 책의 저자는이 터미널을 분리하는 더 명확하다고 생각

(cond 
    ((null? lat) (quote())) 
    ((eq? (car lat) old) (cons old (cons new (cdr lat)))) 
    (else (cons (car lat) (insertR new old (cdr lat))))))) 

을 :

(else (cond 
     ((eq? (car lat) old) (cons old (cons new (cdr lat)))) 
     (else (cons (car lat) (insertR new old (cdr lat))))))))) 

는 처음에 두 번째 cond의 첫 번째 절을 이동하는 것과 같습니다 null 두 가지 다른 조건이 있지만 그 경우라면 대신 if이면 충분합니다.

3

물론 두 정의가 동일하지만 사용자 정의가 읽기 쉽습니다. 당신은 책의 제 3 장에만 있다는 것을 명심하십시오, 그리고 저자는 천천히 가고 싶습니다. 동일한 장의 뒷부분에서 41 페이지에서 중첩하는 cond 양식 대신 단일 cond 양식의 모든 상호 배타적 인 조건을 처리하는 방식으로 정확하게 단순화를 가르쳐 줄 것입니다.

+0

사실 제가 언급 한 예제는 47 페이지에서 몇 가지 단순화 방법을 보여 준 후입니다. 나는이 예제를 단순화하기를 기다렸지 만 절대로하지 않았다. –

3

예, 두 정의는 동일한 동작을합니다.

두 개의 다른 목적을 가지고 있기 때문에 책에 cond이 두 개인 이유는 그 때문입니다. 바깥 쪽 cond은 목록 데이터 형식의 두 경우를 구분합니다. 목록은 두 번째 인수가 목록 인 null 또는 cons입니다. 외부 cond은 소비되는 데이터의 유형에 따라 결정됩니다. 목록에있는 모든 구조적 재귀 함수는 그 바깥 쪽이 cond입니다. 내부의 cond은 정의 된 특정 기능에 따라 다릅니다.

그래서 더 컴팩트 한 반면, 그것들을 분리하여두면 함수의 구조가 재귀 유형의 구조에보다 명확하게 일치하게됩니다. 이 관용구를 일관되게 사용하면 구조적 재귀 함수를 읽기, 디버그 및 유지 관리가 더 쉬워집니다.

3

라이언과 같은 말을하려고합니다. 가독성은 정확성에 이어 두 번째입니다. 실제로 학생 인 경우 정확성보다 중요한 가독성이 일 수 있습니다.

이 책에 나오는 버전의 이점은 공이 있는지 여부를 테스트하는 두 개의 무장 조건이 있다는 것입니다. 이것은 문제를 해소하는 완전히 정상적이고 예상되는 방법입니다. 이 분할을 보면 두 코드 블록의 역할을 신속하게 이해할 수 있습니다. 귀하의 코드에서 나는 세 가지 경우가 철저하고 상호 배타적임을 확인하고 어느 입력이 어떤 쓰레기통에 속하는 지 추론 할 시간을 보내고 중지해야합니다.

여기 사진을 찍어주세요. 11:52 PM입니다. 피곤하고 눈이 다쳤습니다. 학생들이 쓴 같은 문제에 대해 45 가지 이상의 해결책을 읽었습니다. 나는 CLARITY를 찾고 있어요. 당신이 그것을 올바르게했다는 것을 분명하게 보여주는 방법으로 당신의 솔루션을 쓸 수 있다면, 나는 당신에게 100 %를주고 당신의 이름을 축복 할 것입니다.

+1

내가 어디에서 왔는지 알지만, 나이가 들면서 내가 간결함을 더 많이 고할수록, 내가 읽은 코드가 적을수록 기능이 무엇인지 이해하는 것이 더 쉬워진다. 그러나 그것은 확실히 의견의 문제입니다. –

관련 문제