Pregunta

Acabo de empezar a trabajar en este libro por diversión; Desearía que fuera tarea, pero nunca podría permitirme asistir al MIT, y hay toneladas de personas más inteligentes que yo de todos modos. : p

Se supone que

fast-exp encuentra b ^ n, es decir, 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
¿Fue útil?

Solución

Olvidó llamar a fast-exp. En cambio, evaluaste tres átomos separados. Para evaluar realmente la exp. Rápida de 4 a 2, tendría que escribir

(fast-exp 4 2)

Otros consejos

La solución que ha escrito aquí también es incorrecta. p.ej. Echa un vistazo (fast-exp 2 6). Esperado: 64, real: 32.

Su solución es calcular respuestas incorrectas. (Consulte http://ideone.com/quT6A ) De hecho, cómo puede, en principio, escribir una cola recursiva ¿Exponenciación rápida pasando solo dos números como argumentos? No creo que sea posible, porque en medio de la computación no sabes qué multiplicador usar si encuentras un exponente impar. Pero puedo dar un ejemplo de solución de trabajo que es exactamente lo que esperan los autores de SICP (proceso iterativo que usa '' cantidad invariante '' (a * b ^ n), donde a es inicialmente 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))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top