SICP ejercicio 1.16, ¿dónde está mi error, porque me parece correcto?
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 quefast-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
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))