SICP练习1.16,我的bug在哪里,因为它看起来对我来说

时间:2009-10-29 12:54:49

标签: scheme sicp

我刚刚开始阅读这本书以获得乐趣;我希望这是家庭作业,但我永远不能参加麻省理工学院,而且还有很多人比我更聪明。 :P

fast-exp应该找到b ^ n,即4 ^ 2 = 16,3 ^ 3 = 27

(define (fast-exp b n)
  (define (fast-exp-iter n-prime a)
    (cond ((= n-prime 1) a)
          ((= (remainder n-prime 2) 1) (fast-exp-iter (- n-prime 1) (* a b)))
          (else (fast-exp-iter (/ n-prime 2) (* a b b)))))
  (fast-exp-iter n 1))

fast-exp 4 2; Expected 16, Actual 2

3 个答案:

答案 0 :(得分:5)

你忘了打电话给快速曝光。相反,您评估了三个独立的原子。要实际评估4到2的fast-exp,你必须写

(fast-exp 4 2)

答案 1 :(得分:2)

您在此处撰写的解决方案也不正确。例如退房(快速实施2 6)。预期:64,实际:32。

答案 2 :(得分:1)

您的解决方案正在计算错误答案。 (参见http://ideone.com/quT6A)事实上,你原则上如何写一个尾递归快速取幂,只传递两个数作为参数?我认为它甚至不可能,因为在计算过程中,如果遇到奇数指数,你不知道使用什么乘数。 但我可以给出一个工作解决方案的例子,这正是SICP作者所期望的(迭代过程使用“不变量”(a * b ^ n),其中a最初为1)

(define (pow x y)
  (define (powi acc x y)
    (cond
      ((= y 0) acc)
      ((odd? y) (powi (* acc x) x (- y 1)))
      (else (powi acc (* x x) (/ y 2)))))
  (powi 1 x y))