es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Utilizando la recursión para obtener listas de una lista original en Python devuelve un error.

Se me ha asignado una tarea para utilizar la recursividad de manera que cualquier lista que se le proporcione, digamos p, se devuelva en la salida deseada que se muestra al final, sin alterar o cambiar el contenido de p. Cuando ejecuto esta función, dice que la variable local (y) se hace referencia sin asignación, es decir, len(y)==0, pero ya he asignado y fuera de la función init. ¿Alguien puede ayudarme a identificar qué está mal?

y=[] # Para copiar el contenido de x en él para que x no sea modificado
z=[] # Para devolverlo como una lista requerida en la pregunta
p=[1,2,3]

def inits(x):

    if len(y)==0 and len(z)==0:
        y=[i.copy for i in x] # Copiando el contenido de x en y para que no cambie

    if len(z)==len(x)+1: # La lista z tiene un elemento más que la lista x porque tiene []
        print(z)

    else:
        z.append(y.copy())
        if len(y)!=0: # Esto se hace para que cuando y=[] no devuelva un error por y.pop(-1)
            y.pop(-1)
        inits(x)

inits(p)

# Salida deseada
[[1,2,3],[1,2],[1],[]]
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con el código es que la variable y está definida fuera de la función inits y también se está utilizando dentro de ella. Esto crea un conflicto porque Python intenta buscar una variable local con el nombre y dentro de la función, pero no puede encontrarla ya que ya está definida fuera.

    Para resolver este problema, y debería ser definido dentro de la función o hacerlo global usando la palabra clave global. Aquí hay una posible solución donde y está definido dentro de la función:

    z = []
    
    def inits(x, y=None):
        if y is None:
            y = x.copy()
        z.append(y)
        if y:
            inits(x, y[:-1])
    
    p = [1, 2, 3]
    inits(p)
    print(z)
    # Output: [[1, 2, 3], [1, 2], [1], []]
    

    En esta solución, y se inicializa como una copia de x cuando no se proporciona como argumento. El contenido de y se agrega a la lista z y la función se llama recursivamente con una porción de y que excluye el último elemento. Este proceso continúa hasta que todas las porciones de y se hayan agregado a z o y se convierta en una lista vacía.

Comments are closed.