Я только начал изучать erlang (и функциональное программирование), и я застрял в простой программе. Объект программы - найти наибольший простой коэффициент числа. Это моя программа:Отладка простой программы в 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).
Вот как он должен работать для некоторых входов:
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
Но программа всегда возвращает первый простой делитель вместо. lprime(24)->2, lprime(9)->3
Я написал эквивалент (на мой взгляд) программы в Python, которые я больше знакомы с этим выполняет точно так, как ожидалось:
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)
Я также попробовал другую версию без охраны (он выглядит чище, тоже) но это, кажется, идти в бесконечную рекурсию, снова питон эквивалент (ИМО) работает, как ожидалось:
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).
Я пытался отладить программу с помощью DBG, документация которых очень скудны, и я не» Понимать шаги ver хорошо. Эти шаги, которые я использовал, были:
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: Выделено
я не нашел никакой полезной информации из этого и я бы признателен за любые указатели о том, как отлаживать эффективно тоже, но основном я бы как знать, что заставляет программу терпеть неудачу.
Возможный дубликат [Использование трассировки и dbg в Erlang] (http://stackoverflow.com/questions/1954894/using-trace-and-dbg-in-erlang) –
@SteveVinoski Использование trace и dbg - это моя второстепенная проблема , в первую очередь я хочу знать, почему эта программа терпит неудачу. –
другой инструмент - приложение отладчика: debugger: start() – Pascal