studyingeugene / studyingeugene.github.io

공부한 내용을 기록하기 위한 아카이브입니다. Hexo와 NexT를 이용해서 만들었습니다.
0 stars 0 forks source link

SICP 연습문제 1.17 & 1.18 친절한 풀이 | 이태화 연구기록 아카이브 #2

Open utterances-bot opened 1 year ago

utterances-bot commented 1 year ago

SICP 연습문제 1.17 & 1.18 친절한 풀이 | 이유진 아카이브

곱셈 프로시저의 성능 높이기

https://studyingeugene.github.io/sicp/chapter-1/exercise-1-17/

DaewoongChoi commented 1 year ago

안녕하세요 sicp를 공부하고 있는 초보 개발자입니다. 저도 같은 아이디어로 풀긴 했는데 0일 때 왜 동작이 잘못되는지 여쭤봐도 될까요? else가 붙으면 또 되는 것 같은데 어디가 문제인지를 모르겠어서요 염치불구 물어봅니다.

studyingeugene commented 1 year ago

안녕하세요 sicp를 공부하고 있는 초보 개발자입니다. 저도 같은 아이디어로 풀긴 했는데 0일 때 왜 동작이 잘못되는지 여쭤봐도 될까요? else가 붙으면 또 되는 것 같은데 어디가 문제인지를 모르겠어서요 염치불구 물어봅니다.

(mult-iter a b temp)의 정의에서, b의 값에 따라 3가지의 갈래로 나뉘게 됩니다.

  1. b가 1 인경우
  2. b가 짝수인 경우
  3. 둘 중 아무것도 아닌 경우

b 가 0인 경우 (even? b)는 참을 반환합니다. 이때 a를 2배 해주는 동시에, b를 0.5배 해주게되는데, 0을 0.5배 해도 값이 같기 때문에 문제가 생깁니다.

만약 이 프로시저를 올바르게 고치고 싶다면,

(define (mult-iter a b temp)

    (cond ((= b 0) 0)

          ((= b 1) (+ a temp))

          ((even? b) (mult-iter (double a) (halves b) temp))

          (mult-iter a (- b 1) (temp + a))))

이런 식으로 case를 추가해 주어야 합니다.

DaewoongChoi commented 1 year ago

안녕하세요 sicp를 공부하고 있는 초보 개발자입니다. 저도 같은 아이디어로 풀긴 했는데 0일 때 왜 동작이 잘못되는지 여쭤봐도 될까요? else가 붙으면 또 되는 것 같은데 어디가 문제인지를 모르겠어서요 염치불구 물어봅니다.

(mult-iter a b temp)의 정의에서, b의 값에 따라 3가지의 갈래로 나뉘게 됩니다.

  1. b가 1 인경우
  2. b가 짝수인 경우
  3. 둘 중 아무것도 아닌 경우

b 가 0인 경우 (even? b)는 참을 반환합니다. 이때 a를 2배 해주는 동시에, b를 0.5배 해주게되는데, 0을 0.5배 해도 값이 같기 때문에 문제가 생깁니다.

만약 이 프로시저를 올바르게 고치고 싶다면,

(define (mult-iter a b temp)

    (cond ((= b 0) 0)

          ((= b 1) (+ a temp))

          ((even? b) (mult-iter (double a) (halves b) temp))

          (mult-iter a (- b 1) (temp + a))))

이런 식으로 case를 추가해 주어야 합니다.

감사합니다 글 보고 도움 많이 받고 있습니다.