Python - Error "object of type 'NoneType' has no len()" en funcion recursiva

   
Vista:

Error "object of type 'NoneType' has no len()" en funcion recursiva

Publicado por Jaume Sanchez (2 intervenciones) el 02/12/2011 21:08:09
Hola, estoy haciendo una función recursiva de divide y vencerás que ordena una lista de numeros por negativo y positivo, ej: [1,-9,3,2,-4,-2] --> [-9,-4,-2,1,3,2]

el código es el siguiente:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def negpos(n,p,v):
    if ((len(n)+len(p)) == len(v)):
        return n+p
    else:
        if (v[len(n)+len(p)]<0):
            return negpos(n.append(v[len(n)+len(p)]),p,v)
        if (v[len(n)+len(p)]>0):
            return negpos(n,p.append(v[len(n)+len(p)]),v)
 
def programa(v):
    n = []
    p = []
    negpos(n,p,v)
 
programa([1,-9,3,2,-4,-2])


el caso es que me da este error:

1
2
3
4
5
6
7
8
9
10
Traceback (most recent call last):
  File "C:/Users/Jaume/Desktop/montra.py", line 15, in <module>
    programa([1,-9,3,2,-4,-2])
  File "C:/Users/Jaume/Desktop/montra.py", line 13, in programa
    negpos(n,p,v)
  File "C:/Users/Jaume/Desktop/montra.py", line 8, in negpos
    return negpos(n,p.append(v[len(n)+len(p)]),v)
  File "C:/Users/Jaume/Desktop/montra.py", line 2, in negpos
    if ((len(n)+len(p)) == len(v)):
TypeError: object of type 'NoneType' has no len()


He probado de hacer cada paso de la recursion por separado y funciona bien.

Alguien sabe que he hecho mal?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve

Error

Publicado por xve (1229 intervenciones) el 03/12/2011 09:36:59
Hola Jaume, me ha constado un poco encontrar el problema, pero al final lo he encontrado.
El tema esta en que cuando añades un valor a una lista con append() este no devuelve el contenido de la lista, por eso en la instrucción:
1
return negpos(n,p.append(v[len(n)+len(p)]),v)

python añade el valor a la lista p, pero no devuelve la lista para pasarla en la función.
Una manera sencilla de solucionar-lo seria algo así:
1
2
3
4
5
6
7
8
9
10
def negpos(n,p,v):
    if ((len(n)+len(p)) == len(v)):
        return n+p
    else:
        if (v[len(n)+len(p)]<0):
            n.append(v[len(n)+len(p)])
            return negpos(n,p,v)
        if (v[len(n)+len(p)]>0):
            p.append(v[len(n)+len(p)])
            return negpos(n,p,v)

Espero que te sirva
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Error

Publicado por Jaume Sanchez (2 intervenciones) el 06/12/2011 15:09:02
Muchisimas gracias xve, ya funciona!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar