Missed you return recursive call result:
def encontra_impares(lista, indice=0,I=[]):
if indice > len(lista) - 1:
return I
else:
if lista[indice] % 2 != 0:
I.append(lista[indice])
indice += 1
return encontra_impares(lista, indice, I) # <--- aqui
print(encontra_impares([1, 2, 3, 4, 5])) # [1, 3, 5]
When you just call the function (without the return), it is called and the return is ignored because you do nothing with it (and when the function ends without finding a return, she ends up returning None).
Just for the record, you can also do it without needing an index, or an accumulator list:
def encontra_impares(lista):
if not lista: # lista vazia
return []
if lista[0] % 2 != 0:
return [ lista[0] ] + encontra_impares(lista[1:])
return encontra_impares(lista[1:])
The idea is:
- if the list is empty, returns an empty list
- otherwise, check whether the first element is odd
- if it is, it returns the result of
encontra_impares(lista[1:]) (whereas lista[1:] is a "sub-list" containing the second element on)
- if not odd, returns only the odd of the rest of the list
But of course recursion is not the best way to solve it. The simplest is using a loop even:
def encontra_impares(lista):
impares = []
for n in lista:
if n % 2 != 0:
impares.append(n)
return impares
# ou usando list comprehension
def encontra_impares(lista):
return [ n for n in lista if n % 2 != 0 ]
You do not assign the function return to anything. Try, for example:
print(encontra_impares(lista,indice,I))and evaluate the result.– anonimo