SICP – cap. 1 – procedure come metodo generale – esercizio – 46

14344

Continuo da qui con il prossimo esercizio, qui.

Exercise 1.36.  Modify fixed-point so that it prints the sequence of approximations it generates, using the newline and display primitives shown in exercise 1.22. Then find a solution to xx = 1000 by finding a fixed point of x log(1000)/log(x). (Use Scheme’s primitive log procedure, which computes natural logarithms.) Compare the number of steps this takes with and without average damping. (Note that you cannot start fixed-point with a guess of 1, as this would cause division by log(1) = 0.)

Mi sa che –al solito– seguo Bill, mio tutor virtuale, presente anche su Twitter.
Serve average, come già definita in passato:

(define (average x y)
  (/ (+ x y) 2))

fixed-point resta come quella dell’esecizio (e post) precedente con il solo inserimento delle 2 istruzioni indicate con ;; *** mod.

(define tolerance 0.00001)
(define (fixed-point f first-guess)
  (define (close-enough? v1 v2)
    (< (abs (- v1 v2)) tolerance))
  (define (try guess)
    (display guess)   ;; *** mod
    (newline)         ;; *** mod 
    (let ((next (f guess)))
      (if (close-enough? guess next)
          next
          (try next))))
  (try first-guess))

La sola istruzione nuova è (fixed-point (lambda (x) (/ (log 1000) (log x))) 2.0).

s98

Non fa parte di SICP ma un paio di considerazioni relative all’ambiente Linux (vs. quell’altro di cui non riesco a ricordare il nome).
Eseguo una verifica rapida della bontà del risultato.
Il tool bc in genere ottimo qui si dimostra insufficiente:

s99

OOPS! 😳 l’esponente dev’essere intero, vedi p.es. qui:

expr ^ expr
The result of the expression is the value of the first raised to the second. The second expression must be an integer. (If the second expression is not an integer, a warning is generated and the expression is truncated to get an integer value.) The scale of the result is scale if the exponent is negative. If the exponent is positive the scale of the result is the minimum of the scale of the first expression times the value of the exponent and the maximum of scale and the scale of the first expression. (e.g. scale(a^b) = min(scale(a)*b, max(scale, scale(a))).) It should be noted that expr^0 will always return the value of 1.

Per valutazioni al volo il mio tool preferito resta Calc:

s100
😀 buono vero? Una cosa OT ma è saltata fuori recentemente: attenzione alla funzione log(): non è sempre la stessa per tutti i linguaggi e può generare confusione:

s101

uh! dimenticavo Python

s102

dove, ovviamente

s103

:mrgreen:

Posta un commento o usa questo indirizzo per il trackback.

Trackback

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

%d blogger hanno fatto clic su Mi Piace per questo: