PDA

View Full Version : Algoritmi


diegolbj6
03-12-2011, 12:14
Salve ragazzi mi sto cimentando nella risoluzione di alcuni algoritmi elementari, ma vista la mia incompetenza in materia, non riesco a capirne il funzionamento.
Per iniziare a capire qualcosa volevo provare con la formulazione di un algoritmo che mi dia il fattoriale di un numero n, ed anche con la formulazione dell'algoritmo di un numero x elevato ad n (x^n).
Conoscendo il procedimento matematico, non riesco a trovare il nesso logico con il ciclo di ripetizione finchè, e nemmeno con quello PER, e non avendo le basi necessarie mi blocco ripetutamente ad una non soluzione.

gagginaspinnata
03-12-2011, 13:55
la formulazione dell'algoritmo di un numero x elevato ad n

Questo è molto semplice.

x^2 = x * X
x^3 = x * x * x
ecc.

Per X^n devi fare un ciclo di n-1 volte dove moltiplichi X * X

Ad esempio

<?php

function esponente($x , $n){

$ris = 1;

for($i=1;$i<=$n ; $i++){

$ris = $ris * $x;

}

return $ris;

}

echo esponente(3,3);

?>

Dovrebbe andare

Gimli[2BV!2B]
03-12-2011, 14:07
Invece di darti un esempio proverò a scriverti quello che è il mio usuale approccio ad un problema.
Qual'è la formula o il più generale obiettivo da perseguire?
Qual'è l'esatta sequenza di operazioni che faresti per calcolare/eseguire un caso specifico? (naturalmente limitando i dati in modo da poter scrivere od immaginare l'intera sequenza)
Esiste una porzione della sequenza di operazioni che si ripete più volte con le stesse operazioni e condizioni ma con dati diversi?
Riesci a dare un nome rappresentativo a tutti i dati utilizzati?
Quali operazioni, dati e/o calcoli sono necessari per essere pronti ad iniziare il calcolo?
Quali condizioni permettono di capire che il calcolo è terminato?
Mettiamo che il problema sia il numero x^n, se voglio calcolare 1^1 o 1^0 il tuo algoritmo da il risultato atteso in questi casi?

Generalizzando:

Devi aver chiaro il problema, oppure spezzarlo in problemi più piccoli ben definiti.
Determina una soluzione esatta del problema.
Determina le eventuali porzioni ripetitive e sostituiscile con una ripetizione della sequenza minima.
Parametrizza i dati.
Determina condizioni e stato iniziale.
Determina condizioni e stato finale.
Analizza il comportamento nei casi limite.
Personalmente ho riscontrato che il controllo dei casi limite può portare ad apportare discrete variazioni alla soluzione, quindi il sesto punto è l'ultimo solo perché è possibile controllarlo solo quando si ha un algoritmo abbozzato, ma può costringere a tornare indietro di qualche passo.
Il punto uno è un piccolo mondo a se in caso di grandi problemi, praticamente si dovrebbe cercare di suddividere l'algoritmo richiesto in un insieme di problemi più piccoli, chiari e più semplici da risolvere, che si risolveranno separatamente e verranno poi combinati per dare una soluzione completa.

Uno strumento che permette di rappresentare efficacemente un algoritmo è il diagramma di flusso (http://www.google.it/search?q=diagramma+di+flusso), ti consiglierei di provare a disegnarli perché credo permettano di assimilare meglio il metodo.

IngMetallo
03-12-2011, 20:00
;36477590']

[CUT]

Uno strumento che permette di rappresentare efficacemente un algoritmo è il diagramma di flusso (http://www.google.it/search?q=diagramma+di+flusso), ti consiglierei di provare a disegnarli perché credo permettano di assimilare meglio il metodo.

Verissimo !!! Io ho cominciato da poco e all'università al corso di fondamenti il professore ci faceva addirittura eseguire i diagrammi di flusso a mano per verificare che il programma funzionasse.. a volte perdevamo più tempo per controllare il diagramma che non ad elaborare l'algoritmo.. Alla fine però ne è valsa la pena perché fai l'abitudine a padroneggiare cicli e condizioni :)

diegolbj6
04-12-2011, 09:57
Visto che lo devo fare a mano, se scrivo in questo modo è coretto?
inizio
leggi n
Se (n=0)
allora
msg: "il fattoriale di 0 è 1";
fine allora
altrimenti
fatt(n)=1
finchè (n>0)
fatt(n)=n*fatt (n-1)
fine finchè
stampa: fatt(n)
fine allora
fine se
fine

Gimli[2BV!2B]
04-12-2011, 14:29
L'elaborazione del fattoriale è l'esempio principe per la programmazione ricorsiva (in soldoni una funzione che richiama se stessa passandosi le variabili aggiornate e ritornando il risultato parzialmente calcolato).

Il metodo ricorsivo non è però l'unico approccio, è possibile risolvere il problema comodamente anche in modo iterativo (cioè con un semplice ciclo).

La tua soluzione, così com'è scritta, è una via di mezzo tra soluzione ricorsiva ed iterativa.
Non avendo definito una funzione, fatt(n) sembra un improprio nome di variabile (l'hai anche inizializzato).
È presente il test per il termine dell'elaborazione ricorsiva (serve per la soluzione iterativa?).

Mettiamo un paio di paletti:

diciamo che vogliamo risolvere in modo iterativo
diamo un nome migliore alla variabile che contiene il risultato: fatt(n) -> fatt_n
Codice indentato e con il nuovo nome di variabile (ho cercato anche di capire come combinare le parole Altrimenti, ecc... non so bene quale sia la convenzione che adotti ma mi sembrava mancasse qualcosa...):Inizio
leggi n ;
Se (n = 0)
Allora
msg: "il fattoriale di 0 è 1" ;
fine Allora
Altrimenti
fatt_n = 1 ;

Finchè (n > 0)
fatt_n = n * fatt_n ;
***devi fare qualcos'altro***
fine Finchè
Stampa: fatt_n ;
fine Altrimenti
fine Se
fineLa soluzione iterativa può esser ridotta ulteriormente.
Se hai già affrontato l'argomento funzioni potresti modificare il codice in modo da renderlo correttamente ricorsivo (anche in questo caso la tua proposta di soluzione non era molto distante dall'essere corretta).