35 Duas pilhas, p1 e p2, foram implementadas em Python, por...
a) Não estou removendo os valores de p1 + Recursão infinita porque nunca vou chegar na condição de parada
b) GAB
c) Valores de p1 ficarão na ordem inversa
d) Valores de p1 ficarão na ordem inversa
e) Não estou removendo os valores de p1
Apenas complementando,
Tanto a função del quanto a função pop removem itens de uma lista, seja ela uma Fila ou uma Pilha.
A principal diferença é que a função pop, além de remover o item da lista, retorna tal item. Já a função del não realiza o retorno do item removido.
FONTE: https://www.delftstack.com/pt/howto/python/what-is-difference-between-del-remove-and-pop-on-python-lists/
Inicialmente, a pilha p1 contém os elementos 50,40,30,20,10, logo, possuindo len(p1) > 0. Dessa forma, gostaria de tirar a seguinte dúvida: como qualquer uma das letras a,b e c podem estar corretas, se len(p1) == 0 nunca será verdadeira, antes de fazer as operações necessárias?
Kelvin,
Essa questão está aparecendo mal formatada, talvez por isso você esteja com dúvida, mas vamos lá.
Esse if serve para dar fim a recursividade que é utilizada nessas funções.
def fb(p1,p2):
if(len(p1)==0):
return
x=p1[len(p1)-1]
del p1[len(p1)-1]
fb(p1,p2) #A recursividade está aqui
p2.append(x)
Em outras palavras:
Se tamanho(p1) igual a 0:
retorna #Encerra função
Portanto só vai entrar nesse if quando p1 tiver tamanho igual a zero.
Dá um olhada na questão pela prova da cesgranrio que você vai entender melhor
https://www.cesgranrio.org.br/pdf/caixa0121/provas/caixa0121_prova_ti.pdf
a função pop remove o ultimo elemento de um array, então não pode ser nem a letra C e nem D, portanto é a letra B
Obrigado professor de estrutura de dados por ensinar(ou não) recursão, uma delícia resolver uma questão dessa !
Só eu que acho que essa questão tem um erro nas opções?
Faria sentido o gabarito. Porém, se vocês notarem, a iteração não espera pegar todos os elementos pra depois colocar na lista 2. Ela assim que tira o elemento e remove da lista 1, já coloca na lista 2. Pra que a resolução fizesse sentido, o Append teria que estar sem o gap do if.
Alternativa Correta: B
A questão aborda o conceito de operações em pilhas na linguagem de programação Python. Pilhas (stacks) são estruturas de dados do tipo LIFO (Last In, First Out), ou seja, o último elemento a ser inserido é o primeiro a ser removido. Na linguagem Python, as pilhas podem ser facilmente implementadas com listas, usando os métodos append()
para adicionar um elemento ao topo da pilha e pop()
para remover o elemento do topo.
A resolução da questão exige um entendimento de como transferir os elementos de uma pilha para outra, conservando a ordem original dos elementos. Para isso, devemos utilizar um algoritmo que remova elementos do topo de p1
e os insira no topo de p2
. Isso deve continuar até que p1
esteja vazia.
Na alternativa B, a função fb(p1, p2)
é apresentada da seguinte forma:
def fb(p1,p2): if(len(p1) == 0): return x = p1[len(p1)-1] del p1[len(p1)-1] fb(p1, p2) p2.append(x)
A função começa verificando se a pilha p1
está vazia. Se estiver, a função retorna e não faz nada. Caso contrário, o último elemento de p1
é armazenado em x
, e então removido da pilha p1
com o comando del
. Após isso, a função chama a si mesma recursivamente, transferindo os elementos restantes. Quando a execução retrocede da recursão (após atingir a condição de terminação, ou seja, p1
vazia), ela começa a adicionar os elementos armazenados em x
em p2
. Isso garante que a ordem original dos elementos é mantida.
Note que essa abordagem é recursiva e respeita a ordem original dos elementos, pois ela desmonta a pilha p1
e só começa a montar a pilha p2
na volta da recursão, mantendo assim a ordem dos elementos transferidos. Por isso, a alternativa B é a correta.