Ich habe gerade begonnen, Erlang (und funktionale Programmierung) zu lernen, und ich bin auf einem einfachen Programm stecken. Das Ziel des Programms ist es, den größten Primfaktor einer Zahl zu finden. Das ist mein Programm:Debugging eines einfachen Programms in Erlang
lprime(N, L, D) when D == N->
if N rem D == 0 -> D;
true-> L
end;
lprime(N,L,D) ->
if N rem D == 0 ->
lprime(N/D, D, D);
true -> lprime(N, L, D+1)
end.
lprime(N)->
lprime(N,1,2).
Hier ist, wie es für einige Eingaben ausgeführt werden soll:
lprime(3)->lprime(3,1,2)->lprime(3,1,3)->3
lprime(36)->lprime(36,1,2)->lprime(18,2,2)->lprime(9,2,2)->lprime(9,2,3)->lprime(3,3,3)->3
lprime(14)->lprime(14,1,2)->lprime(7,2,2)->lprime(7,2,3)->lprime(7,2,4)->lprime(7,2,5)->lprime(7,2,6)->lprime(7,1,7)->7
Aber das Programm immer den ersten Primdivisor statt. lprime(24)->2, lprime(9)->3
ich ein äquivalentes schrieb (meiner Meinung nach) Programm in Python, die ich mehr vertraut bin mit, dass genau wie erwartet ausführt:
def lprime(N, L=1, D=2):
if D==N:
if N%D == 0: return D
return L
if N%D == 0:
return lprime(N/D, D, D)
return lprime(N, L, D+1)
Ich habe auch versucht, eine andere Version ohne Schutz (es sieht auch cleaner) aber dieser in eine unendliche Rekursion zu gehen scheint, wieder der python-Äquivalent (IMO) wie erwartet funktioniert:
lprime2(1, L, D) ->
L;
lprime2(N,L,D) ->
if N rem D == 0 ->
lprime2(N/D, D, D);
true -> lprime2(N, L, D+1)
end.
lprime2(N)->
lprime2(N,1,2).
ich habe versucht, das Programm mit DBG zu debuggen, die Dokumentation von denen ist sehr spärlich und I don‘ verstehe die Schritte ver Gut. Die Schritte, die ich verwendet wurden, waren:
1> dbg:start().
{ok,<0.35.0>}
2> dbg:tracer().
{ok,<0.35.0>}
3> dbg:tp(first,lprime, 1, []).
{ok,[{matched,[email protected],1}]}
4> dbg:tp(first,lprime,3,[]).
{ok,[{matched,[email protected],1}]}
5> dbg:p(all,c).
{ok,[{matched,[email protected],26}]}
6> first:lprime(10).
(<0.33.0>) call first:lprime(10)
2
7> first:lprime(10,1,2).
(<0.33.0>) call first:lprime(10,1,2)
Edit: Hervorhebungen
ich keine nützlichen Informationen aus diesem fand und ich schätzen würde keine Hinweise, wie man effektiv zu debuggen, aber vor allem würde ich möchte wissen, was das Programm zum Scheitern bringt.
Mögliche Duplikate von [Using Trace und dbg in Erlang] (http://stackoverflow.com/questions/1954894/using-trace-and-dbg-in-erlang) –
@SteveVinoski Verwendung von Trace und dbg ist meine zweitrangige Angelegenheit In erster Linie möchte ich wissen, warum dieses Programm fehlschlägt. –
ein anderes Werkzeug ist die Debugger-Anwendung: debugger: start() – Pascal