2013-11-12 5 views
2

Я пытался использовать рекурсию пролога, чтобы получить следующий результат. ? - треугольник (5).Рекурсия и петля в прологе

++++1 
    +++12 
    ++123 
    +1234 
    12345 

Это то, что я сделал до сих пор, но это не дает мне ожидаемого результата.

triangle(X):-X>=1,nl, LS is X-1,plus(LS),triangle(LS),process(X),nl. 
triangle(X):-X=<1. 
process(X):- X>=1,NS is X+1,process(NS),write(X). 

process(X):-X=<1. 

plus(N):-N>=1, LS is N-1, write('+'),plus(LS). 

plus(N):-N=<1. 
+0

Я бы предложил использовать [tag: dcg] s для этой цели. – false

ответ

1

Вам необходимо добавить переменную для каждого измерения, которое вы хотите «обходить».

Затем перебирайте каждую строку и в каждой строке повторяйте столбцы. Вместо добавления новых имен предикатов», вы можете добавить переменные различать:

triangle(N) :- 
    triangle(1, N). 

triangle(R, N) :- 
    triangle(1, R, N), 
    ( R < N 
    -> R1 is R+1, 
     triangle(R1, N) 
    ; true 
    ). 

triangle(C, R, N) :- 
    ( C =< N-R 
    ... 
    ), 
    ( C < N 
    ... 
    ; nl 
    ). 

В правиле строки печати, я оставляю некоторые - хитрый - код, чтобы узнать для вашей практики :)

0

Решил попробуйте и решите его с помощью findall, так вот мое решение :)

print_array([]):-nl. 
print_array([H|T]) :- maplist(write,H),nl,print_array(T). 
triangle(N) :- numlist(1,N,Nums), 
       findall('+',member(_,Nums),Pluses), 
       findall(R,(prefix(NumL,Nums),prefix(P,Pluses),not(NumL=[]),length(P,PL),length(NumL,NL),N is PL+NL,append(P,NumL,R)),Rez), 
       print_array(Rez). 
+0

нет рекурсии здесь? – CapelliC

+0

есть распечатка списка :) – ssBarBee

+0

почему вы не используете findall? :-) – CapelliC

Смежные вопросы