문제

나는 방금 SICP를 통해 일하기 시작했고 (내 혼자; 이것은 수업을위한 것이 아닙니다), 나는 며칠 동안 운동 1.6으로 어려움을 겪고 있었고 그것을 알아낼 수없는 것 같습니다. 이것은 Alyssa가 다시 정의하는 곳입니다 if 측면에서 cond, 그렇게 :

(define (new-if predicate then-clause else-clause)
    (cond (predicate then-clause)
          (else else-clause))

그녀는 몇 가지 간단한 경우에서 성공적으로 테스트 한 다음이를 사용하여 Square Root 프로그램을 다시 작성합니다 ( if):

(define (sqrt-iter guess x)
    (new-if (good-enough? guess x)
            guess
            (sqrt-iter (improve guess x)
                       x)))

그런 다음 질문은 다음과 같이 묻습니다. "Alyssa가 이것을 정사각형 뿌리를 계산하기 위해 이것을 사용하려고 시도 할 때 어떻게됩니까? 설명하십시오." [필요한 경우 다른 절차를 재현하게되어 기쁩니다 (good-enough?, improve, 등), 그냥 알려주세요.

이제 나는 무슨 일이 일어나는지 알고 있습니다. 그것은 결코 값을 반환하지 않기 때문에 프로그램이 무한히 되돌아갑니다. 왜 이런 일이 일어나는지 설명 할 수 없습니다. 미묘한 차이가 무엇이든간에 if 그리고 new-if 나를 피하고 있습니다. 모든 것이 큰 감사를 표합니다.

도움이 되었습니까?

해결책

new-if 기능입니다. 함수가 호출되면 체계가 인수 목록에서 가장 먼저하는 일은 무엇입니까? 평가합니다 모두 논쟁.

다른 팁

new-if 절차이며, 계획은 응용 주문 평가 (1.1.5)를 사용하므로 이전에도 new-if 실제로 수행됩니다. 먼저 모든 인수를 평가해야합니다. guess 그리고 (sqrt-iter (improve guess x) x). 후자의 주장은 재귀이며 새로운 new-if 절차, 이것이 무한 루프가 발생하는 방식입니다.

평범한 if 먼저 주장을 평가할 필요는 없습니다. 그냥 길을 따라 가십시오. 이것이 차이입니다. if 그리고 new-if. :)

우선 당신은해야합니다 차이를 이해하십시오 적용 주문 평가와 정상 순서 사이. LISP는 적용 순서를 사용하지만 조건부 표현은 정상적인 기능과 같지 않은 것으로 평가됩니다 (SICP 1.1.6 장):

(if <predicate> <consequent> <alternative>)

IF 표현을 평가하기 위해 통역사는 평가하여 시작합니다. <predicate> 표현의 일부. 만약 <predicate> 실제 가치로 평가하고 통역사는 다음을 평가합니다. <consequent> 그리고 그 가치를 반환합니다. 그렇지 않으면 평가합니다 <alternative> 그리고 그 가치를 반환합니다.

Ex1.6. NEW-IF :

(define (new-if predicate then-clause else-clause)
     (cond (predicate then-clause)
                (else else-clause)))

'If Statements'와의 차이 : IF 진술은 술어에서 하나씩 평가 -> 결과 -> 대안으로 평가합니다.

그러나 'New-IF'는 모든 매개 변수를 평가해야합니다. 일명 인수는 그 순간 ( 'else-clause'를 의미하는 순간)를 평가해야합니다.

따라서 이러한 매개 변수 중 하나라도 반복 루프로 호출 할 때 무한 루프가 발생합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top