Ir para o conteúdo
soraiaduarte

recursão e listas imbricadas

Mensagens Recomendadas

soraiaduarte

boas!

estou a tentar definir uma função que calcula o mínimo de uma lista de listas imbricadas de forma recursiva.

a minha ideia era criar uma nova lista com todos os inteiros e depois, a partir dessa lista, calcular o mínimo.

a minha duvida é: o que há de errado com o que fiz para que a lista ls que criei não contenha os inteiros da lista imbricada? como colocá-los lá?

def recursive_min(l):
ls=[]
for elm in l:
	if type(elm)==type([]):
		recursive_min(elm)
	else:
		ls.append(elm)
return ls
#etc... (a ideia era depois calcular o mínimo da ls)
print(recursive_min([2, 9, [1, 13], 8, 6]))

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
hmiguel

boas!

estou a tentar definir uma função que calcula o mínimo de uma lista de listas imbricadas de forma recursiva.

a minha ideia era criar uma nova lista com todos os inteiros e depois, a partir dessa lista, calcular o mínimo.

a minha duvida é: o que há de errado com o que fiz para que a lista ls que criei não contenha os inteiros da lista imbricada? como colocá-los lá?

def recursive_min(l):
ls=[]
for elm in l:
	if type(elm)==type([]):
		recursive_min(elm)
	else:
		ls.append(elm)
return ls
#etc... (a ideia era depois calcular o mínimo da ls)
print(recursive_min([2, 9, [1, 13], 8, 6]))

Repara que sempre que entras na função apagas tudo o que está na lista ls. Ora vê lá.


"Homem que é Homem não usa Java!"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
djthyrax

Pensa antes desta maneira:

Tens uma lista, e queres saber o mínimo desta lista. Corres uma funcao para calcular o minimo em cada elemento. Se esse elemento for uma lista, vais calcular o valor minimo nessa lista e consideras que o elemento original é na verdade esse valor mínimo.


Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
soraiaduarte

Muito obrigada pelas vossas dicas, ajudaram-me bastante. Já consegui construir a função definindo outra dentro dela para evitar o problema de apagar a ls. Mas, de qq das formas, gostava de conseguir construir dessa maneira que me dizes. Fiz isto:

def recursive_min(l):
prim=l[0]
for i in range(len(l)):
	if type(prim)==type(6) and type(l[i])==type(6):
		if l[i]<prim:
			prim=l[i]
	else:
		recursive_min(l[i])
return prim
print(recursive_min([2, 9, [1, 13], 8, 6]))

mas não está a funcionar. Ainda não estou muito a vontade na recursão. O que está errado com o que eu fiz? Como posso melhorar a função?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
KTachyon

Tens que comparar os resultados das chamadas recursivas.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
djthyrax

Repara que não estás a usar o resultado da chamada recursive_min() em lado nenhum para usares. Tens que guardar esse valor para fazeres a comparação.

Repara também que tens que verificar primeiro se o elemento é uma lista e só depois de chamares a funcao recursive_min() para a converter para um número (o mínimo dessa lista) é que fazeres a comparação.

Fica aqui um exemplo com uma approach um pouco diferente:

def recursive_min(l):
    first = True
    m = 0
    if len(l) == 0:
        return 0

    if type(l[0]) != type(6):
        l[0]=recursive_min(l[0]) #aqui está o que te estava a faltar

    if len(l) == 1:
        return l[0]
    
    for i in range(len(l)):
        for j in range(len(l))[1:]:	
            if type(l[j]) != type(6):
                l[j]=recursive_min(l[j]) #aqui está o que te estava a faltar
            
            if first:
                m = min(l[i], l[j]) #aqui está o porquê de precisares de guardar o resultado
                first = False
            else:
                m = min(m, l[i], l[j]) #aqui está o porquê de precisares de guardar o resultado
    return m

print recursive_min([[9,[9,[9,9]]]])


Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.