FrankViolence
07-01-2013, 17:29
Salve!
Mi sto spaccando la testa pensando a come risolvere questo problema posto dal professore nell'esame di programmazione dell'anno scorso (io ce l'ho il 21 gennaio e il fatto di non riuscire a risolvere questo mi mette una certa ansia!).
Vi posto il testo:
Un numero x compreso nell’intervallo [0, 1[ (cioè tale che 0 ≤ x < 1) può essere codificato, eventualmente in forma
approssimata, tramite una sequenza finita di cifre binarie, precisamente quelle che comparirebbero a destra del punto
che separa la parte intera dalla parte frazionaria nella rappresentazione in base 2. Definisci una procedura fract-part
che, data una stringa f di 0/1, restituisce il valore numerico x di f interpretata come parte frazionaria in base 2.
Esempi:
(fract-part "0") → 0 (fract-part "01") → 0.25 (fract-part "101") → 0.625
(fract-part "1") → 0.5 (fract-part "11") → 0.75 (fract-part "0101") → 0.3125
Voi come fareste? Avete qualche suggerimento?
Opzionale: ho provato a risolverlo in modo ricorsivo usando le liste (anche se l'input è una stringa, dovrei attuare la conversione da stringa a lista, ma quello lo implementerò dopo, ora mi interessa più che altro trovare il procedimento), però il risultato viene giusto solo se l'input è 0 o 1, altrimenti gli altri sono tutti sbagliati.
Avete idea di dove potrei aver sbagliato? Vi posto il codice:
(define fract-part
(lambda (bin)
(let ((n (length bin)))
(if (= n 0)
0
(+ (* (car bin) (/ 1 expt 2 (+ n 1))) (fract-part (cdr bin)))))))
Grazie mille per l'attenzione!
Mi sto spaccando la testa pensando a come risolvere questo problema posto dal professore nell'esame di programmazione dell'anno scorso (io ce l'ho il 21 gennaio e il fatto di non riuscire a risolvere questo mi mette una certa ansia!).
Vi posto il testo:
Un numero x compreso nell’intervallo [0, 1[ (cioè tale che 0 ≤ x < 1) può essere codificato, eventualmente in forma
approssimata, tramite una sequenza finita di cifre binarie, precisamente quelle che comparirebbero a destra del punto
che separa la parte intera dalla parte frazionaria nella rappresentazione in base 2. Definisci una procedura fract-part
che, data una stringa f di 0/1, restituisce il valore numerico x di f interpretata come parte frazionaria in base 2.
Esempi:
(fract-part "0") → 0 (fract-part "01") → 0.25 (fract-part "101") → 0.625
(fract-part "1") → 0.5 (fract-part "11") → 0.75 (fract-part "0101") → 0.3125
Voi come fareste? Avete qualche suggerimento?
Opzionale: ho provato a risolverlo in modo ricorsivo usando le liste (anche se l'input è una stringa, dovrei attuare la conversione da stringa a lista, ma quello lo implementerò dopo, ora mi interessa più che altro trovare il procedimento), però il risultato viene giusto solo se l'input è 0 o 1, altrimenti gli altri sono tutti sbagliati.
Avete idea di dove potrei aver sbagliato? Vi posto il codice:
(define fract-part
(lambda (bin)
(let ((n (length bin)))
(if (= n 0)
0
(+ (* (car bin) (/ 1 expt 2 (+ n 1))) (fract-part (cdr bin)))))))
Grazie mille per l'attenzione!