2010-11-20 10 views
5

De "Programación Erlang" por Cesarini ejercicio 3-2creación de la lista en Erlang

Como voy a través de "Programación de Erlang" me da problemas de creación de la lista extraños. Del ejercicio 3-2 escribí dos funciones similares.

create(0) -> []; 
create(N) when N > 0 -> [ N | create(N-1) ]. 

reverse_create(0) -> []; 
reverse_create(N) when N > 0 -> [ reverse_create(N-1) | N ]. 

así crea (3) genera como era de esperar.

ejercicio3: crear (3).
[3,2,1]

pero reverse_create no genera la lista que espero.

exercise3: reverse_create (3).
[[[[] | 1] | 2] | 3]

¿Qué necesito cambiar para que reverse_create (3) devuelve [1,2,3]? Gracias por la explicación.

+0

OK, tengo el ejemplo trabajando ¿Alguna pista de por qué las dos funciones similares anteriores devuelven respuestas tan diferentes? ¿Por qué se crea una lista limpia de return mientras que reverse_create devuelve listas de listas? – Superpolock

+0

puede leer esto para obtener una explicación: http://learnyousomeerlang.com/starting-out-for-real#lists y también ver estos: http://stackoverflow.com/questions/3232786/how-to-concat-lists -in-erlang-without-creating-nested-lists y http://stackoverflow.com/questions/1919097/functional-programming-what-is-an-improper-list –

Respuesta

5

reverse_create devuelve una lista y usted la usa como elemento principal para crear la lista que genera listas anidadas. Pruebe esta solución:

reverse_create(0) -> []; 
reverse_create(N) when N > 0 -> reverse_create(N-1) ++ [N]. 

EDIT: Una mejor aplicación sería:

reverse_create2(N) -> reverse_create_helper(N, []). 

reverse_create_helper(0, Acc) -> 
    Acc; 
reverse_create_helper(N, Acc) -> 
    reverse_create_helper(N-1, [N|Acc]). 
+1

Hace agradable O (N^2) de O (N) tarea. –

+0

He hecho las ediciones como correctamente señaló ya que ++ copia el operando izquierdo. –

2

Por supuesto, siempre se puede hacer:

reverse_create(N) -> lists:reverse(create(N)). 

Esto realmente correr más rápido. Pero obviamente esa no es la intención del ejercicio. :)

3

Normalmente, una función como reverse_create se haría de forma recursiva con un acumulador.

reverse_create(N) -> 
    reverse_create(N, []). 

reverse_create(0, Acc) -> 
    Acc; 
reverse_create(N, Acc) when N > 0 -> 
    reverse_create(N - 1, [N | Acc]). 
1

estoy leyendo el mismo libro, por lo que no soy más experto que usted, pero esto funcionó para mí ...

create(0) -> []; 
create(N) when N > 0 -> create(N-1) ++ [N]. 

reverse_create(0) -> []; 
reverse_create(N) when N > 0 -> [N|create(N-1)]. 
-1

Ésta es

 


    reverse_create(0) -> []; 
    reverse_create(N) -> 
     list_create_1(1, N, []). 

    list_create_1(I, N, List) when N >= I -> 
     list_create_1(I + 1, N, [I | List]); 
    list_create_1(_, _, List) -> List. 

 
Cuestiones relacionadas