• Non ci sono risultati.

• Esercizio: Ricerca Binaria • Approfondimenti sul passaggio dei parametri Ricorsione

N/A
N/A
Protected

Academic year: 2021

Condividi "• Esercizio: Ricerca Binaria • Approfondimenti sul passaggio dei parametri Ricorsione"

Copied!
8
0
0

Testo completo

(1)

• Ricorsione

• Realizzare funzioni ricorsive

• Approfondimenti sul passaggio dei parametri e valore restituito da una funzione

• Esercizio: Fattoriale

• Esercizio: Ricerca Binaria

Concett i chiave

Ricorsione

(2)

Una funzione ricorsiva chiama se stessa:

void prova(void){

……….

prova();

………..

}

 E’ una tecnica di programmazione che si applica a problemi che richiedono una soluzione ricorsiva, ossia espressa in termini di se stessa

 Esempio: calcolo del fattoriale n! Il fattoriale prevede una soluzione ricorsiva per definizione:

n! = n  (n  1)!

Ricorsione

(3)

Ricorsione

Come realizzare una funzione ricorsiva ?

Inserire una o più istruzione if-else per prevedere i casi in cui la ricorsione termina

Nei casi in cui la ricorsione deve continuare, si deve inserire la chiamata alla stessa funzione con gli opportuni parametri attuali

Attenzione: se la funzione torna un valore la chiamata ricorsiva deve essere preceduta da return

void prova(parametri formali){

……….

if (condizione) prova(parametri attuali);

}

int prova(parametri formali){

……….

if (condizione) return prova(par.attuali);

else return valore;

}

(4)

#include <stdio.h>

unsigned long numero;

double fat(unsigned long n){

if (n>1) return(n*fat(n-1));

else return (1);

}

int main(void) {

printf("\nCALCOLO DI n! ");

printf("\nInserisci un numero: ");

scanf("%u", &numero);

printf("\nFattoriale di %d e' %e", numero, fat(numero));

}

Mentre la soluzione iterativa sarebbe stata:

fat=1.0;

while (n>1) fat*=n--;

Ricorsione: Fattoriale

(5)

Ricorsione: Esecuzione

Return

Address Link

Dinamico n=3

Ritorno = 3*fat(2)

fat(3)

Return Address

Link Dinamico n=1

Ritorno = 1

fat(1)

Return

Address Link

Dinamico Parametri Formali

Variabili Locali

main()

Return Address

Link Dinamico n=2

Ritorno = 2*fat(1) fat(2)

Stack double fat(unsigned long n){

if (n>1) return(n*fat(n-1));

else return (1);

}

int main(void) {

printf("\n%e", fat(3));

}

Ritorno = 2 Ritorno = 6

(6)

Ricorsione: Esecuzione

Return

Address Link

Dinamico n=3

Ritorno = 3*fat(2)

fat(3)

Return Address

Link Dinamico n=1

Ritorno = 1

fat(1)

Return

Address Link

Dinamico Parametri Formali

Variabili Locali

main()

Return Address

Link Dinamico n=2

Ritorno = 2*fat(1) fat(2)

Stack /*E se mi dimentico il return ?*/

double fat(unsigned long n){

if (n>1) n*fat(n-1);

else return (1);

}

int main(void) {

printf("\n%e", fat(3));

}

Ritorno = ???

Ritorno = 2

(7)

Ricorsione

Ricerca Binaria

Vettore ordinato (inf,…,sup)

Si confronta l’elemento da cercare con l’elemento di indice med=(inf+sup)/2

Se è quello, fine

Se è <, si riapplica la ricorsione al vettore compreso tra gli indici inf e sup=med-1

Se è >, si riapplica la ricorsione al vettore compreso tra gli indici inf=med+1 e sup

Se inf>sup, allora l’elemento cercato non esiste, fine

(8)

Ricerca Binaria

unsigned short RicercaBinaria(float v[], int inf, int sup, float x){

int medio=(inf+sup)/2;

if (inf>sup) return 0;

if (v[medio]==x) return 1;

if (v[medio]>x) return RicercaBinaria(v,inf,medio-1,x);

return RicercaBinaria(v,medio+1,sup,x);

}

Riferimenti

Documenti correlati

• Scrivere una funzione ricorsiva (in C) che, avendo in input un array di n interi di interi positivi, dia in output TRUE se tutti gli elementi sono maggiori di 10, FALSE altrimenti..

  Individuare, in un gruppo di palline l’unica pallina di peso maggiore delle altre facendo uso di una bilancia “a basculla” (Per semplicità: il numero di palline sia una

•  Il valore iniziale di parametri formali viene definito all’atto della chiamata della funzione dal programma chiamante tramite il passaggio dei parametri attuali.. Corso

Si scriva per ognuna di tali funzioni un programma in C che verifichi il corretto funzionamento di tale funzione, Si leggano dall’input i valori dell’array ed eventuali altri

Da allora, i monaci del tempio si alternano per spostare i dischi dal piolo originario ad un altro piolo, seguendo le rigide regole di Brahma: i dischi vanno ma- neggiati uno

• anche in questo caso nel corpo della funzione si attiva una sola chiamata ricorsiva, dato che le due chiamate sono alternative l’una all’altra; quindi la successione delle

Esso contiene: l’indirizzo di ritorno all’istruzione che il main dovrà eseguire dopo la conclusione della funzione fact (tale istruzione è y=valore di ritorno della

tale indirizzo deve corrispondere a quello utilizzato dal segnalante per l’invio del modulo di adesione, ad eccezione dei casi in cui il segnalante stesso non sia tenuto al possesso