Forum >> Principianti >> funzioni ricorsive casi a confronto (basic programing knowledge)

Pagina: 1

Salve,

scusatemi tanto se quella che sto per fare è una domanda troppo basilare. Sto apprendendo python facendo vari esercizi che si trovano in giro per il web, ed è da qualche giorno che mi sto “scervellando “ alla ricerca di risposte sul web.

Non capisco la dinamica delle funzioni ricorsive!!!

la “ricorsione” semplice è facile da comprendere; come per esempio in:
def contoallarovescia(n):
 if n <= 0:
	print('Via!')
 else:
	print(n)
	contoallarovescia(n-1)
si tratta di un singolo auto-richiamo della stessa funzione con modifica iterativa decrescente del parametro.

Quindi mi aspetto che se per esempio do “contoallarovescia(5)” la funzione mi stampi 6,5,4,3,2,1 Via! cosa che fa regolarmente.

Fin qui tutto ok.



Però la difficoltà di comprensione aumenta con altri due esempi:

Esempio
nr1:

        count=0
     def tri_recursion(k):
	global count
	count+=1
	if(k > 0):
		result = k + tri_recursion(k - 1)
		print(result)
	else:
		result = 0
	return result


	tri_recursion(5)
	print(count)

in questo caso, simile a quello sopra riportato, l’esecuzione della funziona restituisce numeri crescenti. Come mai? Perché questo comportamento, per me inaspettato?

0 1 3 6 10 15

il valore di ingresso del parametro k non dovrebbe essere 5 ed andare scalando di a 1?

Esempio
nr2:
def fibonacci(n):
	pdb.set_trace()
	if n <= 1:
		return n
	else:
		return (fibonacci(n-1) + fibonacci(n-2))


limite = int(input('Inserisci il numero di valori della serie che desideri vedere '))


for num in range(1, limite+1):
	print(fibonacci(num))

anche in questo caso, già trattato più volte ma mai spiegato nella sua dinamica.

Analizzando e cercando di esplodere le due “ricorsioni” fibonacci(n-1) e fibonacci(n-2) non arrivo proprio a capirne il processamento.
Ipotizzando di impostare come parametro n=6 la successione risultante è:
1
1
2
3
5
8

perché la prima iterazione dà: 1 (cioè la somma tra 0 e 1) mentre l’ultima iterazione dà: 8 (cioè la somma di 5 e di 3)? non dovrebbe ritornare una sequenza decrescente? Da dove saltano fuori quei numeri?


Cercando di verificare come funziona la logica di esecuzione della funzione ricorsiva ho cercato di
studiare i passi tramite debug:

per l’Esempio1:

mentre il valore di k decrementa di 1 da 5 a 0, per ogni iterazione lo stack
di “result” mi da

*** NameError: name 'result' is not defined

come mai questo comportamento?


per L’Esempio2:

dopo la prima iterazione entra in questo “codice parallelo”

class StdOutputFile(StdioFile):
429 class StdOutputFile(StdioFile):
430 def writable(self):
431 return True
432
433 ->	def write(self, s):
434 if self.closed:
435 raise ValueError("write to closed file")
436 s = str.encode(s, self.encoding, self.errors).decode(self.encoding, self.errors)
437 return self.shell.write(s, self.tags)

class StdInputFile(StdioFile):
441 _line_buffer = ''


Grazie
per L'AIUTO E PER L'EVENTUALE spiegazione









--- Ultima modifica di bomaires in data 2020-04-22 19:39:52 ---

--- Ultima modifica di bomaires in data 2020-04-22 19:41:16 ---

--- Ultima modifica di bomaires in data 2020-04-22 19:42:02 ---

--- Ultima modifica di bomaires in data 2020-04-22 19:46:38 ---

--- Ultima modifica di bomaires in data 2020-04-22 19:55:25 ---


--- Ultima modifica di bomaires in data 2020-04-22 20:10:37 ---

--- Ultima modifica di bomaires in data 2020-04-22 21:30:32 ---


--- Ultima modifica di bomaires in data 2020-04-23 12:04:40 ---

--- Ultima modifica di bomaires in data 2020-04-23 12:06:51 ---
salve, mi scuso... sto facendo progressi..
ho trovato una parziale spiegazione della meccanica ricorsiva che aiuta di più a capire che non l'elencazione di esempi e relativi output senza spiegazione del processo computazionale.
ho trovato questo sito: https://www.askpython.com/python/python-recursion-function
Per chi capiterà su questa discussione con i miei stessi dubbi, avrà le delucidazioni di merito.



Mi rimane ancora il dubbio sull'esempio nr1, che ho fatto nel precedente post, sul perchè la serie non è in ordine decrescente.

Partendo da un argomento k=5 la prima iterazione dovrebbe essere:

result = [5 + tri_recursion(4)] + [4+tri_recursion(3)] + [3+tri_recursion(2)] + [2+tri_recursion(1)] + [1+tri_recursion(0)] =15

la seconda iterazione dovrebbe essere:

result =[4+tri_recursion(3)] + [3+tri_recursion(2)] + [2+tri_recursion(1)] + [1+tri_recursion(0)]=10

e così via

invece mi restituisce una serie numerica crescente...










---------


--- Ultima modifica di bomaires in data 2020-04-25 11:13:08 ---


--- Ultima modifica di bomaires in data 2020-04-25 11:29:01 ---

--- Ultima modifica di bomaires in data 2020-04-25 14:06:37 ---

--- Ultima modifica di bomaires in data 2020-04-25 14:07:34 ---

--- Ultima modifica di bomaires in data 2020-04-25 14:10:38 ---


Pagina: 1



Esegui il login per scrivere una risposta.