SICP exercício 1.16, onde está o meu erro, porque parece certo para mim

StackOverflow https://stackoverflow.com/questions/1643518

  •  10-07-2019
  •  | 
  •  

Pergunta

Eu apenas comecei a trabalhar através deste livro para se divertir; Eu gostaria que fosse a lição de casa, mas eu nunca poderia dar ao luxo de assistir MIT, e há toneladas de pessoas mais inteligentes do que eu mesmo. : P

rápido-exp é suposto encontrar b ^ n, isto é, 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
Foi útil?

Solução

Você esqueceu de chamar fast-exp. Em vez disso, você avaliou três átomos separados. Para realmente avaliar o fast-exp de 4 a 2, você teria que escrever

(fast-exp 4 2)

Outras dicas

A solução que você escreveu aqui também está incorreto. por exemplo. Confira (fast-EXP 2 6). Esperado: 64, real:. 32

A sua solução está calculando respostas erradas. (Veja http://ideone.com/quT6A ) Na verdade, como você, em princípio, pode escrever uma cauda-recursivo exponenciação rápida passando apenas dois números como argumentos? Eu não acho que é mesmo possível, porque no meio de computação que você não sabe o multiplicador a ser usado se você encontrar expoente ímpar. Mas eu posso dar um exemplo de solução que é exatamente o que é esperado pelos autores SICP (processo iterativo usando "quantidade invariante" (a * b ^ n), onde a é inicialmente 1)

trabalho
(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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top