Programing

SICP에서 Exercise 1.6에 대한 설명은 무엇입니까?

lottogame 2020. 12. 11. 07:39
반응형

SICP에서 Exercise 1.6에 대한 설명은 무엇입니까?


저는 이제 막 SICP를 통해 작업을 시작하고 있습니다 (내 혼자서, 이것은 수업이 아닙니다). 그리고 며칠 동안 운동 1.6으로 고군분투 해 왔지만 알아낼 수없는 것 같습니다. 이것은 Alyssa가 다음 과 같이 if에서 다시 정의한 것 입니다 cond.

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

그녀는 몇 가지 간단한 경우에 성공적으로 테스트 한 다음이를 사용하여 제곱근 프로그램을 다시 작성합니다 (에서 잘 작동 함 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함수입니다. 함수가 호출 될 때 Scheme이 인수 목록으로 가장 먼저하는 일은 무엇입니까? 모든 인수를 평가 합니다 .


new-if절차이며, 반응식 그래서 전에도 실용적 차 평가 (1.1.5) 사용 new-if되어 실제로는 우선 인자를 평가할 수 있으며, 수행, guess(sqrt-iter (improve guess x) x). 후자의 인수가 새 new-if프로 시저 를 호출하는 재귀라는 것을 알 수 있습니다 . 이것이 무한 루프가 발생하는 방식입니다.

일반 if필요가 인수 먼저, 그냥 길을 따라 갈 평가하지,이 사이의 차이 ifnew-if. :)


우선 적용 주문 평가와 일반 주문 의 차이이해해야합니다 . Lisp는 적용 순서를 사용하지만 조건식은 일반 함수와 달리 평가됩니다 ( sicp 장 1.1.6 ) :

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

if 표현식을 평가하기 위해 인터프리터 <predicate>는 표현식 일부를 평가하여 시작 합니다. 경우 <predicate>실제 값으로 평가는 인터프리터는 다음을 평가 <consequent>하고 그 값을 반환합니다. 그렇지 않으면를 평가하고 <alternative>그 값을 반환합니다.


예 1.6. 새로운 경우 :

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

'if-statements'와의 차이점 : if- 문은 술어-> 결과-> 대안에서 하나씩 평가합니다.

그러나 'new-if'는 모든 매개 변수를 평가해야합니다 (즉, 'else-clause'가 처음에 평가된다는 의미입니다 !!).

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

참고 URL : https://stackoverflow.com/questions/1171252/whats-the-explanation-for-exercise-1-6-in-sicp

반응형