Pascal's triangle: Difference between revisions
Content added Content deleted
Ttmrichter (talk | contribs) (→{{header|Lua}}: Added a Logtalk implementation.) |
|||
Line 3,992: | Line 3,992: | ||
for [i 1 10] [print pascal :i]</syntaxhighlight> |
for [i 1 10] [print pascal :i]</syntaxhighlight> |
||
=={{header|Logtalk}}== |
|||
Our implementation will have an object <code>pascals</code> with work done in the method <code>triangle/2</code>. We will be caching results for time efficiency at the cost of space efficiency,and the <code>reset/0</code> method will flush that cache should it grow to be a problem. The resulting object looks like this: |
|||
<syntaxhighlight lang="logtalk"> |
|||
:- object(pascals). |
|||
:- uses(user, [succ/2]). |
|||
:- public(reset/0). |
|||
:- dynamic(triangle_/3). |
|||
reset :- retractall(triangle_(_,_,_)). |
|||
:- public(triangle/2). |
|||
triangle(N, Lines) :- |
|||
triangle(N, _, DiffLines), |
|||
difflist::as_list(DiffLines, Lines). |
|||
% Shortcut with cached value if it exists. |
|||
triangle(N, Line, DiffLines) :- triangle_(N, Line, DiffLines), !. |
|||
triangle(N, Line, DiffLines) :- |
|||
succ(N0, N), |
|||
triangle(N0, Line0, DiffLines0), |
|||
ZL = [0|Line0], |
|||
list::append(Line0, [0], ZR), |
|||
meta::map(plus, ZL, ZR, Line), |
|||
difflist::add(Line, DiffLines0, DiffLines), |
|||
asserta(triangle_(N, Line, DiffLines)). |
|||
triangle(1, [1], [[1]|X]-X). |
|||
:- end_object. |
|||
</syntaxhighlight> |
|||
{{Out}} |
|||
Using the SWI-Prolog back-end: |
|||
<pre> |
|||
?- {meta(loader)}. % messages elided |
|||
?- {types(loader)}. % messages elided |
|||
?- {pascals}. |
|||
% [ /home/michael/junk/pascals.lgt loaded ] |
|||
% (0 warnings) |
|||
true. |
|||
?- pascals::triangle(17, Ls), logtalk::print_message(banner, user, Ls). |
|||
- [1] |
|||
- [1,1] |
|||
- [1,2,1] |
|||
- [1,3,3,1] |
|||
- [1,4,6,4,1] |
|||
- [1,5,10,10,5,1] |
|||
- [1,6,15,20,15,6,1] |
|||
- [1,7,21,35,35,21,7,1] |
|||
- [1,8,28,56,70,56,28,8,1] |
|||
- [1,9,36,84,126,126,84,36,9,1] |
|||
- [1,10,45,120,210,252,210,120,45,10,1] |
|||
- [1,11,55,165,330,462,462,330,165,55,11,1] |
|||
- [1,12,66,220,495,792,924,792,495,220,66,12,1] |
|||
- [1,13,78,286,715,1287,1716,1716,1287,715,286,78,13,1] |
|||
- [1,14,91,364,1001,2002,3003,3432,3003,2002,1001,364,91,14,1] |
|||
- [1,15,105,455,1365,3003,5005,6435,6435,5005,3003,1365,455,105,15,1] |
|||
- [1,16,120,560,1820,4368,8008,11440,12870,11440,8008,4368,1820,560,120,16,1] |
|||
Ls = [[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4|...], [1, 5, 10|...], [1, 6|...], [1|...], [...|...]|...]. |
|||
?- |
|||
</pre> |
|||
=={{header|Lua}}== |
=={{header|Lua}}== |