Pages: [1]   Go Down
Print
Author Topic: funzione ricorsiva sui naturali  (Read 1387 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
rox
Forumista
***
Offline Offline

Posts: 633


« on: 10-08-2014, 12:31:14 »

cose si potrebbe risolvere questo esercizio?
Scrivere una funzione ricorsiva  reverse_int che dato in input SOLO n,restituisca il naturale ottenuto invertendo l'ordine delle cifre di n. Ovvero reverse_int(1234)=4321.
Una cosa che potrebbe aiutare è che se abbiamo il numero 1234, allora 4=1234%10, mentre 123=1234/10... ma anche avendo questi dettagli non riesco a trovare una soluzione ...

il mio problema sta in questo:
quando io prendo l'ultimo elemento del numero, come faccio a sapere se è un'unità, decina, centinaia, ecc?? utilizzando solo un input come argomento è possibile fare questa funzione secondo voi?  testate
Logged

Una macchina è in grado di lavorare come cinquanta uomini comuni, ma nessuna macchina può svolgere il lavoro di un uomo straordinario.
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.474


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #1 on: 10-08-2014, 16:46:22 »

Certo che è possibile.

inizializzi il risultato R da calcolare su 0, poi
puoi fare un ciclo (while)
Ad ogni iterazione, tu
- verifichi che il numero N trattato sia > 0 (condizione di entrata del while)
- in questo caso, si entra nel ciclo e tu giustamente prima trovi C := N%10
- inserisci C in coda ad R tramite R := R*10 + C
- togli C da N tramite N := N/10 (divisione intera!)

Questo codice JavaScript può aiutarti a comprendere, e lo puoi provare nel browser! (apri la console javascript, in Chrome con F12) e usalo:
Code:
function reverse_int (n) {var r=0; while (n>0) {c=n%10; r=r*10+c; n=parseInt(n/10);} return r;}

n=parseInt (Math.random () * Math.pow (10, 10)); console.log (" numero=" + n + "\ninverso=" + reverse_int (n));
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
rox
Forumista
***
Offline Offline

Posts: 633


« Reply #2 on: 11-08-2014, 10:28:24 »

mmm si! ma questa è una funzione iterativa! non ricorsiva come volevo farla io!  [Emoticon] Asd il problema (secondo me è che questa variabile r che tu usi dovrei metterla come parametro di input della funzione ricorsiva... ) .
Logged

Una macchina è in grado di lavorare come cinquanta uomini comuni, ma nessuna macchina può svolgere il lavoro di un uomo straordinario.
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.474


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #3 on: 17-08-2014, 23:50:22 »

Scusa, hai ragione, avevo proprio confuso il concetto di ricorsione testate.

Allora, prova questa metodologia:

caso base - il numero ha una sola cifra: in questo caso, banalmente reverse_int (n):=n
caso iterativo - il numero ha più cifre:
   idea: prendo la cifra più a destra (la meno significativa) e la pongo a sinistra concatenandovi dopo il reverse_int del numero che ottengo rimuovendo tale cifra dal numero:
Code:
function reverse_int (n) {if ((n%10)==n) return n; else return (n%10) * Math.pow(10, Math.floor (Math.log (n)/Math.log (10))) + reverse_int (Math.floor (n/10));}

Una condizione sufficiente per verificare che un numero ha una sola cifra è il fatto che esso coincide con il resto della divisione dello stesso per 10.

Per rimuovere l'ultima cifra, è sufficiente fare la divisone del numero con 10 (se il linguaggio usato non supporta la divisione tra interi, ma fa sempre quella tra numeri decimali, sarà necessario fare poi il floor di tale numero, come ho fatto io perché uso JS).
Per concatenare tale numero a destra di un altro, posso fare la somma di questo numero con quello che ottengo moltiplicando per una opportuna potenza di 10 dell'altro.
Per conoscere quante cifra usa la rappresentazione decimale del numero intero n, è sufficiente fare questo calcolo:
\fs{4}c(n)=\lfloor{\log_{10}{\({n}\)}}\rfloor+1

Siccome io devo spostare a sinistra il numero ottenuto come ultima cifra di n (cioè n%10), devo moltiplicare questa ultima cifra per \fs{3}10^{c(\lfloor{\frac{n}{10}}\rfloor)}=10^{\lfloor{\log_{10}{\({\lfloor{\frac{n}{10}}\rfloor}\)}}\rfloor+1}=10^{\lfloor{\log_{10}{n}\rfloor} (da non confondere con \fs{3}10^{\log_{10}{n}}=n), e poi aggiungerla al reverse_int del numero a cui ho tolto l'ultima cifra (cioe del numero \fs{3}\lfloor{\frac{n}{10}\rfloor.

In linguaggio matematico la funzione è definita così:

\fs{4}\text{reverseint}(n)=\{\begin{matrix}n&&\text{se }n\% 10=n\\(n\% 10)\cdot 10^{\lfloor{\frac{n}{10}}\rfloor}+\text{reverseint}({\lfloor{\frac{n}{10}}\rfloor})&&\text{altrimenti}\end{matrix}
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
Pages: [1]   Go Up
Print
Jump to: