2012-09-23 25 views
5

Como un ejercicio de aprendizaje de scala y programación funcional, implementé la siguiente def sin cola recursiva que calcula el pascal's number en cualquier ubicación. El programa en sí sirve como la definición del triángulo de Pascal. Se ve gráficamente de la siguiente maneraerlang vs jvm (scala) rendimiento de recursión

 1 
    1 1 
    1 2 1 
    1 3 3 1 
1 4 6 4 1 
1 5 10 10 5 1 
... 

def pascal(c: Int, r: Int): Int = 
    if (c == 0 || c == r) 1 else pascal(c - 1, r - 1) + pascal(c, r - 1) 

Sin embargo cuando se trata de una duración de pascal(25,50) en Mac OS X 10.6.8 (2,53 GHz Intel Core 2 Duo) que todavía no ha terminado de ejecutarse después de 20 minutos .

sólo para comparar con Erlang, he instalado R15B02 y escribí programa equivalente de la siguiente manera:

-module(pascal). 
-export([calc_pascal/2]). 

calc_pascal(0,_) -> 1; 
calc_pascal(C,R) when C==R -> 1; 
calc_pascal(C,R) when C<R -> calc_pascal(C-1,R-1) + calc_pascal(C-1,R). 

pascal:calc_pascal(25,50) acabados en ~ 4 seg.

¿Por qué podría ser la razón de tanta diferencia de rendimiento? ¿Jvm no está tan avanzado como el tiempo de ejecución de erlang para programas recursivos?

+0

Scala se realizó en Eclipse de compilar y ejecutar de JUnit, no desde REPL –

+2

'calc_pascal (C-1, R)' debe ser 'calc_pascal (C, R -1) ' –

+0

Quien haya votado negativamente esto debería comentar por qué ... De las preguntas frecuentes sobre la votación negativa:' publicación notoriamente descuidada, sin esfuerzo invertido', que claramente no es el caso ... –

Respuesta

13

Si cometo el mismo error en el programa Scala que hizo en la versión de Erlang, se ejecuta muy rápido. ¿Podría ser esta la razón?

+0

¡Uy! El programa de Erlang fue corregido y parece funcionar para siempre también. Gracias por señalar. Supongo que esta elegante implementación recursiva no es escalable :( –

3

rendimiento número de Pascal en ms código

c,r  Scala Erlang 
10,20 21  22 
11,22 6  72 
12,24 16  272 
13,26 71  1034 
14,28 299  3982 
15,30 802  16124 
16,32 3885 60420