Catalan numbers: Difference between revisions
→{{header|langur}}
(→{{header|Minimal BASIC}}: Added) |
Langurmonkey (talk | contribs) |
||
(44 intermediate revisions by 20 users not shown) | |||
Line 21:
*[[Evaluate binomial coefficients]]
<br><br>
=={{header|11l}}==
<
L(n) 1..15
print(c)
c = 2 * (2 * n - 1) * c I/ (n + 1)</
{{out}}
<pre>
Line 45 ⟶ 44:
2674440
</pre>
=={{header|360 Assembly}}==
Very compact version.
<
USING CATALAN,R15
LA R7,1 c=1
Line 69 ⟶ 67:
PG DS CL24
YREGS
END CATALAN</
{{out}}
<pre>
Line 88 ⟶ 86:
15 9694845
</pre>
=={{header|ABAP}}==
This works for ABAP Version 7.40 and above
<syntaxhighlight lang="abap">
report z_catalan_numbers.
Line 125 ⟶ 122:
write / |C({ sy-index - 1 }) = { catalan_numbers=>get_nth_number( sy-index - 1 ) }|.
enddo.
</syntaxhighlight>
{{out}}
Line 146 ⟶ 143:
C(14) = 2674440
</pre>
=={{header|Action!}}==
{{libheader|Action! Tool Kit}}
<
PROC Main()
Line 168 ⟶ 164:
PrintF("C(%B)=",n) PrintRE(c)
OD
RETURN</
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Catalan_numbers.png Screenshot from Atari 8-bit computer]
Line 188 ⟶ 184:
C(15)=9694845
</pre>
=={{header|Ada}}==
<
procedure Test_Catalan is
Line 205 ⟶ 200:
Put_Line (Integer'Image (N) & " =" & Integer'Image (Catalan (N)));
end loop;
end Test_Catalan;</
{{out|Sample output}}
<pre>
Line 225 ⟶ 220:
15 = 9694845
</pre>
=={{header|ALGOL 68}}==
<
# (64-bit quantities in Algol 68G which can handle up to C23) #
Line 258 ⟶ 252:
FOR i FROM 0 TO 15 DO
print( ( whole( i, -2 ), ": ", whole( catalan( i ), 0 ), newline ) )
OD</
{{out}}
<pre>
Line 278 ⟶ 272:
15: 9694845
</pre>
=={{header|ALGOL W}}==
<
% print the catalan numbers up to C15 %
integer Cprev;
Line 289 ⟶ 282:
write( s_w := 0, i_w := 3, n, ": ", i_w := 9, Cprev );
end for_n
end.</
{{out}}
<pre>
Line 309 ⟶ 302:
15: 9694845
</pre>
=={{header|APL}}==
<
{{out}}
<pre>1 1 2 5 14 42 132 429 1430 4862 16796 58786 208012 742900 2674440</pre>
=={{header|Arturo}}==
<
if? n=0 -> 1
else -> div (catalan n-1) * (4*n)-2 n+1
Line 326 ⟶ 317:
pad.left to :string catalan i 20
]
]</
{{out}}
Line 346 ⟶ 337:
14 2674440
15 9694845</pre>
=={{header|AutoHotkey}}==
As AutoHotkey has no BigInt, the formula had to be tweaked to prevent overflow. It still fails after n=22
<
out .= "`n" Catalan(A_Index)
Msgbox % clipboard := SubStr(out, 2)
Line 368 ⟶ 358:
Return i
}</
{{out}}
<pre>1
Line 385 ⟶ 375:
2674440
9694845</pre>
=={{header|AWK}}==
<
BEGIN {
for (i=0; i<=15; i++) {
Line 402 ⟶ 391:
}
return(ans)
}</
{{out}}
<pre>
Line 429 ⟶ 418:
Use of <code>REDIM PRESERVE</code> means this will not work in QBasic (although that could be worked around if desired).
<
REDIM SHARED results(0) AS SINGLE
Line 446 ⟶ 435:
END IF
catalan = results(n)
END FUNCTION</
{{out}}
1 1
Line 463 ⟶ 452:
14 2674440
15 9694845
==={{header|Applesoft BASIC}}===
{{works with|Chipmunk Basic}}
{{works with|QBasic}}
<syntaxhighlight lang="qbasic">10 HOME : REM 10 CLS for Chipmunk Basic/QBasic
20 DIM c(15)
30 c(0) = 1
40 PRINT 0, c(0)
50 FOR n = 0 TO 14
60 c(n + 1) = 0
70 FOR i = 0 TO n
80 c(n + 1) = c(n + 1) + c(i) * c(n - i)
90 NEXT i
100 PRINT n + 1, c(n + 1)
110 NEXT n
120 END</syntaxhighlight>
==={{header|BASIC256}}===
{{trans|FreeBASIC}}
<syntaxhighlight lang="freebasic">function factorial(n)
if n = 0 then return 1
return n * factorial(n - 1)
end function
function catalan1(n)
prod = 1
for i = n + 2 to 2 * n
prod *= i
next i
return int(prod / factorial(n))
end function
function catalan2(n)
if n = 0 then return 1
sum = 0
for i = 0 to n - 1
sum += catalan2(i) * catalan2(n - 1 - i)
next i
return sum
end function
function catalan3(n)
if n = 0 then return 1
return catalan3(n - 1) * 2 * (2 * n - 1) \ (n + 1)
end function
print "n", "First", "Second", "Third"
print "-", "-----", "------", "-----"
print
for i = 0 to 15
print i, catalan1(i), catalan2(i), catalan3(i)
next i</syntaxhighlight>
{{out}}
<pre>Same as FreeBASIC entry.</pre>
==={{header|BBC BASIC}}===
<syntaxhighlight lang="bbcbasic"> 10 FOR i% = 1 TO 15
20 PRINT FNcatalan(i%)
30 NEXT
40 END
50 DEF FNcatalan(n%)
60 IF n% = 0 THEN = 1
70 = 2 * (2 * n% - 1) * FNcatalan(n% - 1) / (n% + 1)</syntaxhighlight>
{{out}}
<pre> 1
1
2
5
14
42
132
429
1430
4862
16796
58786
208012
742900
2674440</pre>
==={{header|Chipmunk Basic}}===
{{works with|Chipmunk Basic|3.6.4}}
{{trans|Run BASIC}}
<syntaxhighlight lang="qbasic">10 FOR i = 1 TO 15
20 PRINT i;" ";catalan(i)
30 NEXT
40 END
50 SUB catalan(n)
60 catalan = 1
70 IF n <> 0 THEN catalan = ((2*((2*n)-1))/(n+1))*catalan(n-1)
80 END SUB</syntaxhighlight>
==={{header|Craft Basic}}===
<syntaxhighlight lang="basic">dim c[16]
let c[0] = 1
for n = 0 to 15
let p = n + 1
let c[p] = 0
for i = 0 to n
let q = n - i
let c[p] = c[p] + c[i] * c[q]
next i
print n, " ", c[n]
next n</syntaxhighlight>
{{out| Output}}<pre>
0 1
1 1
2 2
3 5
4 14
5 42
6 132
7 429
8 1430
9 4862
10 16796
11 58786
12 208012
13 742900
14 2674440
15 9694845
</pre>
==={{header|FreeBASIC}}===
<syntaxhighlight lang="freebasic">' FB 1.05.0 Win64
Function factorial(n As UInteger) As UInteger
If n = 0 Then Return 1
Return n * factorial(n - 1)
End Function
Function catalan1(n As UInteger) As UInteger
Dim prod As UInteger = 1
For i As UInteger = n + 2 To 2 * n
prod *= i
Next
Return prod / factorial(n)
End Function
Function catalan2(n As UInteger) As UInteger
If n = 0 Then Return 1
Dim sum As UInteger = 0
For i As UInteger = 0 To n - 1
sum += catalan2(i) * catalan2(n - 1 - i)
Next
Return sum
End Function
Function catalan3(n As UInteger) As UInteger
If n = 0 Then Return 1
Return catalan3(n - 1) * 2 * (2 * n - 1) \ (n + 1)
End Function
Print "n", "First", "Second", "Third"
Print "-", "-----", "------", "-----"
Print
For i As UInteger = 0 To 15
Print i, catalan1(i), catalan2(i), catalan3(i)
Next
Print
Print "Press any key to quit"
Sleep</syntaxhighlight>
{{out}}
<pre>
n First Second Third
- ----- ------ -----
0 1 1 1
1 1 1 1
2 2 2 2
3 5 5 5
4 14 14 14
5 42 42 42
6 132 132 132
7 429 429 429
8 1430 1430 1430
9 4862 4862 4862
10 16796 16796 16796
11 58786 58786 58786
12 208012 208012 208012
13 742900 742900 742900
14 2674440 2674440 2674440
15 9694845 9694845 9694845
</pre>
==={{header|FutureBasic}}===
{{trans|FreeBASIC}}
<syntaxhighlight lang="futurebasic">
include "NSLog.incl"
local fn Factorial( n as NSInteger ) as UInt64
UInt64 sum = 0
if n = 0 then sum = 1 : exit fn
sum = n * fn Factorial( n - 1 )
end fn = sum
local fn Catalan1( n as NSInteger ) as UInt64
UInt64 product = 1, result
NSUInteger i
for i = n + 2 to 2 * n
product = product * i
next
result = product / fn Factorial( n )
end fn = result
local fn Catalan2( n as NSInteger ) as UInt64
UInt64 sum = 0
NSUInteger i
if n = 0 then sum = 1 : exit fn
for i = 0 to n - 1
sum += fn Catalan2(i) * fn Catalan2( n - 1 - i )
next
end fn = sum
local fn Catalan3( n as NSInteger ) as UInt64
UInt64 result
if n = 0 then result = 1 : exit fn
result = fn Catalan3( n - 1 ) * 2 * ( 2 * n - 1 ) / ( n + 1 )
end fn = result
NSUInteger i
for i = 0 to 19
if( i < 16 )
NSLog( @"%3d.\t\t%7llu\t\t%12llu\t\t%12llu", i, fn Catalan1( i ), fn Catalan2( i ), fn Catalan3( i ) )
else
NSLog( @"%3d.\t\t%@\t\t%12llu\t\t%12llu", i, @"[-err-]", fn Catalan2( i ), fn Catalan3( i ) )
end if
next
HandleEvents
</syntaxhighlight>
{{output}}
<pre>
0. 1 1 1
1. 1 1 1
2. 2 2 2
3. 5 5 5
4. 14 14 14
5. 42 42 42
6. 132 132 132
7. 429 429 429
8. 1430 1430 1430
9. 4862 4862 4862
10. 16796 16796 16796
11. 58786 58786 58786
12. 208012 208012 208012
13. 742900 742900 742900
14. 2674440 2674440 2674440
15. 9694845 9694845 9694845
16. [-err-] 35357670 35357670
17. [-err-] 129644790 129644790
18. [-err-] 477638700 477638700
19. [-err-] 1767263190 1767263190
</pre>
==={{header|GW-BASIC}}===
{{works with|BASICA}}
<syntaxhighlight lang="gwbasic">
100 REM Catalan numbers
110 DIM C(15)
130 PRINT 0, C(0)
140 FOR N = 0 TO 14
150 C(N + 1) = 0
160 FOR I = 0 TO N
170 C(N + 1) = C(N + 1) + C(I) * C(N - I)
180 NEXT I
190 PRINT N + 1, C(N + 1)
200 NEXT N
210 END
</syntaxhighlight>
{{out}}
<pre>
0 1
1 1
2 2
3 5
4 14
5 42
6 132
7 429
8 1430
9 4862
10 16796
11 58786
12 208012
13 742900
14 2674440
15 9694845
</pre>
==={{header|Liberty BASIC}}===
{{works with|Just BASIC}}
<syntaxhighlight lang="lb">print "non-recursive version"
print catNonRec(5)
for i = 0 to 15
print i;" = "; catNonRec(i)
next
print
print "recursive version"
print catRec(5)
for i = 0 to 15
print i;" = "; catRec(i)
next
print
print "recursive with memoisation"
redim cats(20) 'clear the array
print catRecMemo(5)
for i = 0 to 15
print i;" = "; catRecMemo(i)
next
print
wait
function catNonRec(n) 'non-recursive version
catNonRec=1
for i=1 to n
catNonRec=((2*((2*i)-1))/(i+1))*catNonRec
next
end function
function catRec(n) 'recursive version
if n=0 then
catRec=1
else
catRec=((2*((2*n)-1))/(n+1))*catRec(n-1)
end if
end function
function catRecMemo(n) 'recursive version with memoisation
if n=0 then
catRecMemo=1
else
if cats(n-1)=0 then 'call it recursively only if not already calculated
prev = catRecMemo(n-1)
else
prev = cats(n-1)
end if
catRecMemo=((2*((2*n)-1))/(n+1))*prev
end if
cats(n) = catRecMemo 'memoisation for future use
end function</syntaxhighlight>
{{out}}
<pre>
non-recursive version
42
0 = 1
1 = 1
2 = 2
3 = 5
4 = 14
5 = 42
6 = 132
7 = 429
8 = 1430
9 = 4862
10 = 16796
11 = 58786
12 = 208012
13 = 742900
14 = 2674440
15 = 9694845
recursive version
42
0 = 1
1 = 1
2 = 2
3 = 5
4 = 14
5 = 42
6 = 132
7 = 429
8 = 1430
9 = 4862
10 = 16796
11 = 58786
12 = 208012
13 = 742900
14 = 2674440
15 = 9694845
recursive with memoisation
42
0 = 1
1 = 1
2 = 2
3 = 5
4 = 14
5 = 42
6 = 132
7 = 429
8 = 1430
9 = 4862
10 = 16796
11 = 58786
12 = 208012
13 = 742900
14 = 2674440
15 = 9694845</pre>
==={{header|Minimal BASIC}}===
{{trans|GW-BASIC}}
<
10 REM Catalan numbers
20 DIM C(15)
Line 492 ⟶ 886:
110 NEXT N
120 END
</syntaxhighlight>
==={{header|PureBasic}}===
Using the third formula...
<syntaxhighlight lang="purebasic">; saving the division for last ensures we divide the largest
; numerator by the smallest denominator
Procedure.q CatalanNumber(n.q)
If n<0:ProcedureReturn 0:EndIf
If n=0:ProcedureReturn 1:EndIf
ProcedureReturn (2*(2*n-1))*CatalanNumber(n-1)/(n+1)
EndProcedure
ls=25
rs=12
a.s=""
a.s+LSet(RSet("n",rs),ls)+"CatalanNumber(n)"
; cw(a.s)
Debug a.s
For n=0 to 33 ;33 largest correct quad for n
a.s=""
a.s+LSet(RSet(Str(n),rs),ls)+Str(CatalanNumber(n))
; cw(a.s)
Debug a.s
Next</syntaxhighlight>
{{out|Sample Output}}
<pre>
n CatalanNumber(n)
0 1
1 1
2 2
3 5
4 14
5 42
6 132
7 429
8 1430
9 4862
10 16796
11 58786
12 208012
13 742900
14 2674440
15 9694845
16 35357670
17 129644790
18 477638700
19 1767263190
20 6564120420
21 24466267020
22 91482563640
23 343059613650
24 1289904147324
25 4861946401452
26 18367353072152
27 69533550916004
28 263747951750360
29 1002242216651368
30 3814986502092304
31 14544636039226909
32 55534064877048198
33 212336130412243110
</pre>
==={{header|Run BASIC}}===
<syntaxhighlight lang="runbasic">FOR i = 1 TO 15
PRINT i;" ";catalan(i)
NEXT
FUNCTION catalan(n)
catalan = 1
if n <> 0 then catalan = ((2 * ((2 * n) - 1)) / (n + 1)) * catalan(n - 1)
END FUNCTION</syntaxhighlight>
<pre>1 1
2 2
3 5
4 14
5 42
6 132
7 429
8 1430
9 4862
10 16796
11 58786
12 208012
13 742900
14 2674440
15 9694845</pre>
==={{header|Sinclair ZX81 BASIC}}===
Line 499 ⟶ 982:
The specification asks for the first 15 Catalan numbers. A lot of the other implementations produce either C(0) to C(15), which is 16 numbers, or else C(1) to C(15)—which is 15 numbers, but I'm not convinced they're the first 15. This program produces C(0) to C(14).
<
20 LET X=N
30 GOSUB 130
Line 515 ⟶ 998:
150 LET FX=FX*I
160 NEXT I
170 RETURN</
{{out}}
<pre>0 1
Line 532 ⟶ 1,015:
13 742900
14 2674440</pre>
==={{header|smart BASIC}}===
<syntaxhighlight lang="qbasic">PRINT "Recursive:"!PRINT
FOR n = 0 TO 15
PRINT n,"#######":catrec(n)
NEXT n
PRINT!PRINT
PRINT "Non-recursive:"!PRINT
FOR n = 0 TO 15
PRINT n,"#######":catnonrec(n)
NEXT n
END
DEF catrec(x)
IF x = 0 THEN
temp = 1
ELSE
n = x
temp = ((2*((2*n)-1))/(n+1))*catrec(n-1)
END IF
catrec = temp
END DEF
DEF catnonrec(x)
temp = 1
FOR n = 1 TO x
temp = (2*((2*n)-1))/(n+1)*temp
NEXT n
catnonrec = temp
END DEF</syntaxhighlight>
==={{header|TI-83 BASIC}}===
This problem is perfectly suited for a TI calculator.
<syntaxhighlight lang="ti-83 basic">:For(I,1,15
:Disp (2I)!/((I+1)!I!
:End</syntaxhighlight>
{{out}}
<pre> 1
2
4
14
42
132
429
1430
4862
16796
58786
208012
742900
2674440
9694845
Done</pre>
==={{Header|Tiny BASIC}}===
Integers are limited to 32767 so only the first ten Catalan numbers can be represented. And even then one has to do some finagling to avoid internal overflows.
{{works with|TinyBasic}}
<syntaxhighlight lang="basic">
10 REM Catalan numbers
30 LET C = 1
40 PRINT N," ",C
50 IF N > 9 THEN END
70 GOSUB 200
80 LET C = (2 * N - 1) * C
90 LET C = 2 * C / (N + 1)
110 GOTO 40
210 IF C <= 0 THEN RETURN
220 LET C = C - (N + 1)
230 LET I = I + 1
240 GOTO 210
250 REM To avoid internal overflow, I subtract something clever from
260 REM C and then add it back at the end.</syntaxhighlight>
{{out}}
<pre>0 1
1 1
2 2
3 5
4 14
5 42
6 132
7 429
8 1430
9 4862
10 16796</pre>
==={{header|
<syntaxhighlight lang="vb">Public Sub Catalan1(n As Integer)
'Computes the first n Catalan numbers according to the first recursion given
Dim Cat() As Long
Dim sum As Long
ReDim Cat(n)
Cat(0) = 1
For i = 0 To n
sum =
For j = 0
sum =
Next j
Cat(i + 1) = sum
Next i
Debug.Print
For i = 0 To n
Debug.Print i, Cat(i)
Next
End Sub
Public Sub Catalan2(n As Integer)
'Computes the first n Catalan numbers according to the second recursion given
Dim Cat() As Long
ReDim Cat(n)
Cat(0) = 1
For i = 1 To n
Cat(i) = 2 * Cat(i - 1) * (2 * i - 1) / (i + 1)
Next i
Debug.Print
For i = 0 To n
Debug.Print i, Cat(i)
Next
End Sub</syntaxhighlight>
{{out|Result}}
<pre>
Catalan1 15
0 1
1 1
2 2
3 5
4 14
5 42
6 132
7 429
8 1430
9 4862
10 16796
11 58786
12 208012
13 742900
14 2674440
15 9694845
</pre>
(Expect same result with "Catalan2 15")
==={{header|VBScript}}===
<syntaxhighlight lang="vb">
Function catalan(n)
catalan = factorial(2*n)/(factorial(n+1)*factorial(n))
End Function
Function factorial(n)
If n = 0 Then
Factorial = 1
Else
For i = n To 1 Step -1
If i = n Then
factorial = n
Else
factorial = factorial * i
End If
Next
End If
End Function
'Find the first 15 Catalan numbers.
For j = 1 To 15
WScript.StdOut.Write j & " = " & catalan(j)
WScript.StdOut.WriteLine
Next
</syntaxhighlight>
{{Out}}
<pre>
1 = 1
2 = 2
3 = 5
4 = 14
5 = 42
6 = 132
7 = 429
8 = 1430
9 = 4862
10 = 16796
11 = 58786
12 = 208012
13 = 742900
14 = 2674440
15 = 9694845
</pre>
==={{header|Visual Basic .NET}}===
{{trans|C#}}
<syntaxhighlight lang="vbnet">Module Module1
Function Factorial(n As Double) As Double
If n < 1 Then
Return 1
End If
Dim result = 1.0
For i = 1 To n
result = result * i
Next
Return result
End Function
Function FirstOption(n As Double) As Double
Return Factorial(2 * n) / (Factorial(n + 1) * Factorial(n))
End Function
Function SecondOption(n As Double) As Double
If n = 0 Then
Return 1
End If
Dim sum = 0
For i = 0 To n - 1
sum = sum + SecondOption(i) * SecondOption((n - 1) - i)
Next
Return sum
End Function
Function ThirdOption(n As Double) As Double
If n = 0 Then
Return 1
End If
Return ((2 * (2 * n - 1)) / (n + 1)) * ThirdOption(n - 1)
End Function
Sub Main()
Const MaxCatalanNumber = 15
Dim initial As DateTime
Dim final As DateTime
Dim ts As TimeSpan
initial = DateTime.Now
For i = 0 To MaxCatalanNumber
Console.WriteLine("CatalanNumber({0}:{1})", i, FirstOption(i))
Next
final = DateTime.Now
ts = final - initial
Console.WriteLine("It took {0}.{1} to execute", ts.Seconds, ts.Milliseconds)
Console.WriteLine()
initial = DateTime.Now
For i = 0 To MaxCatalanNumber
Console.WriteLine("CatalanNumber({0}:{1})", i, SecondOption(i))
Next
final = DateTime.Now
ts = final - initial
Console.WriteLine("It took {0}.{1} to execute", ts.Seconds, ts.Milliseconds)
Console.WriteLine()
initial = DateTime.Now
For i = 0 To MaxCatalanNumber
Console.WriteLine("CatalanNumber({0}:{1})", i, ThirdOption(i))
Next
final = DateTime.Now
ts = final - initial
Console.WriteLine("It took {0}.{1} to execute", ts.Seconds, ts.Milliseconds)
End Sub
End Module</syntaxhighlight>
{{out}}
<pre>
CatalanNumber(1:1)
CatalanNumber(2:2)
CatalanNumber(3:5)
CatalanNumber(4:14)
CatalanNumber(5:42)
CatalanNumber(6:132)
CatalanNumber(7:429)
CatalanNumber(8:1430)
CatalanNumber(9:4862)
CatalanNumber(15:9694845)
It took 0.19 to execute
CatalanNumber(0:1)
CatalanNumber(1:1)
CatalanNumber(2:2)
CatalanNumber(3:5)
CatalanNumber(4:14)
CatalanNumber(5:42)
CatalanNumber(6:132)
CatalanNumber(7:429)
CatalanNumber(8:1430)
CatalanNumber(9:4862)
CatalanNumber(10:16796)
CatalanNumber(11:58786)
CatalanNumber(12:208012)
CatalanNumber(13:742900)
CatalanNumber(14:2674440)
CatalanNumber(15:9694845)
It took 0.831 to execute
CatalanNumber(0:1)
CatalanNumber(1:1)
CatalanNumber(2:2)
CatalanNumber(3:5)
CatalanNumber(4:14)
CatalanNumber(5:42)
CatalanNumber(6:132)
CatalanNumber(7:429)
CatalanNumber(8:1430)
CatalanNumber(9:4862)
CatalanNumber(10:16796)
CatalanNumber(11:58786)
CatalanNumber(12:208012)
CatalanNumber(13:742900)
CatalanNumber(14:2674440)
CatalanNumber(15:9694845)
It took 0.8 to execute</pre>
==={{header|Yabasic}}===
{{trans|FreeBASIC}}
<syntaxhighlight lang="yabasic">print " n First Second Third"
print " - ----- ------ -----"
print
for i = 0 to 15
print i using "###", catalan1(i) using "########", catalan2(i) using "########", catalan3(i) using "########"
next i
end
sub factorial(n)
if n = 0 return 1
return n * factorial(n - 1)
end sub
sub catalan1(n)
local proc, i
prod = 1
for i = n + 2 to 2 * n
prod = prod * i
next i
return int(prod / factorial(n))
end sub
sub catalan2(n)
local sum, i
if n = 0 return 1
sum = 0
for i = 0 to n - 1
sum = sum + catalan2(i) * catalan2(n - 1 - i)
next i
return sum
end sub
sub catalan3(n)
if n = 0 return 1
return ((2 * ((2 * n) - 1)) / (n + 1)) * catalan3(n - 1)
end sub</syntaxhighlight>
{{out}}
<pre>Same as FreeBASIC entry.</pre>
=={{header|Befunge}}==
{{trans|Ada}}
<
v 2-1*2p00 :+1g00\< $
> **00g1+/^v,*84,"="<
_^#<`*53:+1>#,.#+5< @</
{{out}}
Line 614 ⟶ 1,408:
14 = 2674440
15 = 9694845</pre>
=={{header|BQN}}==
<syntaxhighlight lang="bqn">Cat←{ 0⊸<◶⟨1, (𝕊-⟜1)×(¯2+4×⊢)÷1+⊢⟩ 𝕩 }
Fact ← ×´1+↕
Cat1 ← { # direct formula
⌊0.5 + (Fact 2×𝕩) ÷ (Fact 𝕩+1) × Fact 𝕩
}
Cat2 ← { # header based recursion
0: 1;
(𝕊 𝕩-1)×2×(1-˜2×𝕩)÷𝕩+1
}
Cat¨ ↕15
Cat1¨ ↕15
Cat2¨ ↕15</syntaxhighlight>
{{out}}
<pre>⟨ 1 1 2 5 14 42 132 429 1430 4862 16796 58786 208012 742900 2674440 ⟩</pre>
=={{header|Bracmat}}==
<
& ( C
=
Line 672 ⟶ 1,481:
& out$(1+(1+-1*tay$((1+-4*X)^1/2,X,16))*(2*X)^-1+-1)
& out$
);</
{{out}}
<
C0 = 1
C1 = 1
Line 742 ⟶ 1,551:
+ 2674440*X^14
+ 9694845*X^15
</syntaxhighlight>
=={{header|Brat}}==
<
true? n == 0
{ 1 }
Line 753 ⟶ 1,561:
0.to 15 { n |
p "#{n} - #{catalan n}"
}</
{{out}}
<pre>0 - 1
Line 772 ⟶ 1,580:
15 - 9694845
</pre>
=={{header|C}}==
All three methods mentioned in the task:
<
typedef unsigned long long ull;
Line 837 ⟶ 1,627:
return 0;
}</
{{out}}
direct summing frac
Line 856 ⟶ 1,646:
14 2674440 2674440 2674440
15 9694845 9694845 9694845
=={{header|C sharp|C#}}==
<
{
/// <summary>
Line 971 ⟶ 1,760:
}
}
}</
{{out}}
<pre>
Line 1,028 ⟶ 1,817:
It took 0.3 to execute
</pre>
=={{header|C++}}==
===4 Classes===
We declare 4 classes representing the four different algorithms for calculating Catalan numbers as given in the description of the task. In addition, we declare two supporting classes for the calculation of factorials and binomial coefficients. Because these two are only internal supporting code they are hidden in namespace 'detail'. Overloading the function call operator to execute the calculation is an obvious decision when using C++. (algorithms.h)
<
#define __ALGORITHMS_H__
Line 1,091 ⟶ 1,879:
} //namespace rosetta
#endif //!defined __ALGORITHMS_H__</
Here is the implementation of the algorithms. The c'tor of each class tells us the algorithm which will be used. (algorithms.cpp)
<
using std::cout;
using std::endl;
Line 1,193 ⟶ 1,981:
product *= (double(n - (k - i)) / i);
return (unsigned long long)(floor(product + 0.5));
}</
In order to test what we have done, a class Test is created. Using the template parameters N (number of Catalan numbers to be calculated) and A (the kind of algorithm to be used) the compiler will create code for all the test cases we need. What would C++ be without templates ;-) (tester.h)
<
#define __TESTER_H__
Line 1,220 ⟶ 2,008:
} //namespace rosetta
#endif //!defined __TESTER_H__</
Finally, we test the four different algorithms. Note that the first one (direct calculation using the factorial) only works up to N = 10 because some intermediate result (namely (2n)! with n = 11) exceeds the boundaries of an unsigned 64 bit integer. (catalanNumbersTest.cpp)
<
#include "tester.h"
using namespace rosetta::catalanNumbers;
Line 1,233 ⟶ 2,021:
Test<15, CatalanNumbersRecursiveSum>::Do();
return 0;
}</
{{out}}
(source code is compiled both by MS Visual C++ 10.0 (WinXP 32 bit) and GNU g++ 4.4.3 (Ubuntu 10.04 64 bit) compilers)
Line 1,301 ⟶ 2,089:
C(15) = 9694845
</pre>
=={{header|Clojure}}==
<
(defn catalan-numbers-direct []
Line 1,319 ⟶ 2,106:
user> (take 15 (catalan-numbers-recursive))
(1 1 2 5 14 42 132 429 1430 4862 16796 58786 208012 742900 2674440)</
=={{header|CLU}}==
<syntaxhighlight lang="clu">catalan = iter (amount: int) yields (int)
c: int := 1
for n: int in int$from_to(1, amount) do
yield(c)
c := (4*n-2)*c/(n+1)
end
end catalan
start_up = proc ()
po: stream := stream$primary_output()
for n: int in catalan(15) do
stream$putl(po, int$unparse(n))
end
end start_up</syntaxhighlight>
{{out}}
<pre>1
1
2
5
14
42
132
429
1430
4862
16796
58786
208012
742900
2674440</pre>
=={{header|Common Lisp}}==
With all three methods defined.
<
;; factorial. CLISP actually has "!" defined for this
(labels ((! (x) (if (zerop x) 1 (* x (! (1- x))))))
Line 1,350 ⟶ 2,168:
for i from 1 to 3 do
(format t "~%Method ~d:~%" i)
(dotimes (i 16) (format t "C(~2d) = ~d~%" i (funcall f i))))</
=={{header|Cowgol}}==
<syntaxhighlight lang="cowgol">include "cowgol.coh";
sub catalan(n: uint32): (c: uint32) is
c := 1;
var i: uint32 := 1;
while i <= n loop
c := (4*i-2)*c/(i+1);
i := i+1;
end loop;
end sub;
var i: uint8 := 0;
while i < 15 loop
print("catalan(");
print_i8(i);
print(") = ");
print_i32(catalan(i as uint32));
print_nl();
i := i+1;
end loop;</syntaxhighlight>
{{out}}
<pre>catalan(0) = 1
catalan(1) = 1
catalan(2) = 2
catalan(3) = 5
catalan(4) = 14
catalan(5) = 42
catalan(6) = 132
catalan(7) = 429
catalan(8) = 1430
catalan(9) = 4862
catalan(10) = 16796
catalan(11) = 58786
catalan(12) = 208012
catalan(13) = 742900
catalan(14) = 2674440</pre>
=={{header|Crystal}}==
{{trans|Ruby}}
<
require "benchmark"
Line 1,395 ⟶ 2,251:
puts "\n direct rec1 rec2"
16.times { |n| puts "%2d :%9d%9d%9d" % [n, catalan_direct(n), catalan_rec1(n), catalan_rec2(n)] }
</syntaxhighlight>
{{out}}
Line 1,426 ⟶ 2,282:
=={{header|D}}==
<
auto product(R)(R r) { return reduce!q{a * b}(1.BigInt, r); }
Line 1,445 ⟶ 2,301:
foreach (cats; TypeTuple!(cats1, cats2, cats3))
cats.take(15).writeln;
}</
{{out}}
<pre>[1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440]
[1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440]
[1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440]</pre>
=={{header|Delphi}}==
See [https://www.rosettacode.org/wiki/Catalan_numbers#Pascal Pascal].
=={{header|EasyLang}}==
<syntaxhighlight lang="text">
func
if
return 1
.
for i = 0 to 14
print catalan i
.
</syntaxhighlight>
=={{header|EchoLisp}}==
{{incorrect|Echolisp|series starts 1, 1, 2, ...}}
<
(lib 'sequences)
(lib 'bigint)
Line 1,525 ⟶ 2,361:
(for ((c C3) (i 15)) (write c))
→ 1 2 5 14 42 132 429 1430 4862 16796 58786 208012 742900 2674440 9694845
</syntaxhighlight>
=={{header|EDSAC order code}}==
The Catalan numbers are here computed by the second method, as a sum of products.
Line 1,535 ⟶ 2,370:
But if we multiply two 35-bit integers A and B, the result is really A*B*(2^-68),
and needs to be multiplied by 2^34 to get the same scaling as for A and B.
<
[Calculation of Catalan numbers.
EDSAC program, Initial Orders 2.]
Line 1,635 ⟶ 2,470:
E 12 Z [define entry point]
P F [acc = 0 on entry]
</syntaxhighlight>
{{out}}
<pre>
Line 1,655 ⟶ 2,490:
15 9694845
</pre>
=={{header|Eiffel}}==
<syntaxhighlight lang="eiffel">
class
APPLICATION
Line 1,695 ⟶ 2,529:
</syntaxhighlight>
{{out}}
<pre>
Line 1,714 ⟶ 2,548:
2674440
</pre>
=={{header|Elixir}}==
{{trans|Erlang}}
<
def cat(n), do: div( factorial(2*n), factorial(n+1) * factorial(n) )
Line 1,739 ⟶ 2,572:
end
Catalan.test</
{{out}}
Line 1,750 ⟶ 2,583:
[1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012,742900,2674440]
</pre>
=={{header|Erlang}}==
<
-export([test/0]).
Line 1,781 ⟶ 2,613:
io:format("Directly:\n~p\n",[[cat(N) || N <- TestList]]),
io:format("1st recusive method:\n~p\n",[[cat_r1(N) || N <- TestList]]),
io:format("2nd recusive method:\n~p\n",[[cat_r2(N) || N <- TestList]]).</
{{out}}
<pre>
Line 1,791 ⟶ 2,623:
[1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012,742900,2674440]
</pre>
=={{header|ERRE}}==
<syntaxhighlight lang="text">PROGRAM CATALAN
PROCEDURE CATALAN(N->RES)
Line 1,808 ⟶ 2,639:
END FOR
END PROGRAM
</syntaxhighlight>
{{out}}
<pre>
Line 1,828 ⟶ 2,659:
15 = 9694845
</pre>
=={{header|Euphoria}}==
<
--User:Lnettnay
Line 1,852 ⟶ 2,682:
for i = 0 to 15 do
? catalan(i)
end for</
{{out}}
<pre>
Line 1,872 ⟶ 2,702:
9694845
</pre>
=={{header|F_Sharp|F#}}==
<
Seq.unfold(fun (c,n) -> let cc = 2*(2*n-1)*c/(n+1) in Some(c,(cc,n+1))) (1,1) |> Seq.take 15 |> Seq.iter (printf "%i, ")
</syntaxhighlight>
{{out}}
<pre>
1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440,
</pre>
=={{header|Factor}}==
The first method:
<
: catalan ( n -- n ) [ 1 + recip ] [ 2 * ] [ nCk * ] tri ;
15 [ catalan . ] each-integer</
{{out}}
<pre>
Line 1,909 ⟶ 2,737:
The last method, memoized by using arrays.
<
: next ( seq -- newseq )
Line 1,918 ⟶ 2,746:
: Catalan ( n -- seq ) V{ 1 } swap 1 - [ next ] times ;
15 Catalan .</
{{out}}
Similar to above.
=={{header|Fantom}}==
{{incorrect|Fantom|series starts 1, 1, 2, ...}}
<
{
static Int factorial (Int n)
Line 1,975 ⟶ 2,802:
}
}
}</
22! exceeds the range of Fantom's Int class, so the first technique fails afer n=10
<pre>
Line 1,994 ⟶ 2,821:
15 -2 9694845 9694845
</pre>
=={{header|Fermat}}==
<
for i=1 to 15 do !Catalan(i);!' ' od;</
{{out}}<pre>
1 2 5 14 42 132 429 1430 4862 16796 58786 208012 742900 2674440 9694845
</pre>
=={{header|Forth}}==
<
=={{header|Fortran}}==
{{works with|Fortran|90 and later}}
<
!=======================================================================================
implicit none
Line 2,050 ⟶ 2,874:
!=======================================================================================
end function catalan_numbers</
{{out}}
<pre>
Line 2,073 ⟶ 2,897:
===============
</pre>
=={{header|Frink}}==
Frink includes efficient algorithms for calculating arbitrarily-large binomial coefficients and automatically caches factorials.
<
for n = 0 to 15
println[catalan[n]]</
=={{header|FunL}}==
<
import util.TextTable
Line 2,165 ⟶ 2,924:
t.row( i, catalan(i), catalan2(i), catalan3(i) )
println( t )</
{{out}}
Line 2,194 ⟶ 2,953:
=={{header|Fōrmulæ}}==
{{FormulaeEntry|page=https://formulae.org/?script=examples/Catalan_numbers}}
'''Solution'''
'''Direct definition'''
[[File:Fōrmulæ - Catalan numbers 01.png]]
[[File:Fōrmulæ - Catalan numbers 02.png]]
'''Direct definition (alternative)'''
The expression <math>\frac{(2n)!}{(n+1)!\,n!}</math> turns out to be equals to <math>\prod_{k=2}^{n}\frac{n + k}{k}</math>
[[File:Fōrmulæ - Catalan numbers 03.png]]
(same result)
'''No directly defined'''
Recursive definitions are easy to write, but extremely inefficient (specially the first one).
Because a list is intended to be get, the list of previous values can be used as a form of memoization, avoiding recursion.
The next function make use of the "second" form of recursive definition (without recursion):
[[File:Fōrmulæ - Catalan numbers 04.png]]
[[File:Fōrmulæ - Catalan numbers 05.png]]
(same result)
=={{header|GAP}}==
<
Catalan2 := n -> Binomial(2*n, n)/(n + 1);
Line 2,231 ⟶ 3,016:
List([0 .. 14], Catalan4);
# Same output for all four:
# [ 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440 ]</
=={{header|Go}}==
Direct:
<
import (
Line 2,247 ⟶ 3,031:
fmt.Println(c.Div(b.Binomial(n*2, n), c.SetInt64(n+1)))
}
}</
{{out}}
<pre>
Line 2,267 ⟶ 3,051:
</pre>
Recursive (alternative):
<syntaxhighlight lang="go">
package main
Line 2,295 ⟶ 3,079:
}
}
</syntaxhighlight>
{{out}}
<pre>
Line 2,314 ⟶ 3,098:
9694845
</pre>
=={{header|Groovy}}==
<syntaxhighlight lang="groovy">
class Catalan
{
Line 2,340 ⟶ 3,123:
}
}
</syntaxhighlight>
{{out}}
<pre>
Line 2,359 ⟶ 3,142:
9694845
</pre>
=={{header|Harbour}}==
<
PROCEDURE Main()
LOCAL i
Line 2,379 ⟶ 3,161:
RETURN nCatalan
</syntaxhighlight>
{{out}}
<pre>
Line 2,399 ⟶ 3,181:
5: 9694845
</pre>
=={{header|Haskell}}==
<
-- definitions in the problem statement.
Line 2,424 ⟶ 3,205:
main :: IO ()
main = mapM_ (print . take 15) [cats1, cats2, cats3]</
{{out}}
<pre>[1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012,742900,2674440]
[1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012,742900,2674440]
[1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012,742900,2674440]</pre>
=={{header|Icon}} and {{header|Unicon}}==
<
every writes(catalan(0 to 14)," ")
end
Line 2,442 ⟶ 3,222:
if n > 0 then
return (n = 1) | \M[n] | ( M[n] := (2*(2*n-1)*catalan(n-1))/(n+1))
end</
{{out}}
<pre>1 1 2 5 14 42 132 429 1430 4862 16796 58786 208012 742900 2674440</pre>
=={{header|J}}==
<
1 1 2 5 14 42 132 429 1430 4862 16796 58786 208012 742900 2674440</
=={{header|Java}}==
Replace double inexact computations with BigInteger implementation.
<
import java.math.BigInteger;
import java.util.ArrayList;
Line 2,561 ⟶ 3,339:
}
</syntaxhighlight>
{{out}}
<pre>
Line 2,582 ⟶ 3,360:
C(15) = 9,694,845 9,694,845 9,694,845
</pre>
=={{header|JavaScript}}==
===Procedural===
<syntaxhighlight lang="javascript"><html><head><title>Catalan</title></head>
<body><pre id='x'></pre><script type="application/javascript">
function disp(x) {
Line 2,612 ⟶ 3,391:
disp(i + '\t' + cata1(i) + '\t' + cata2(i) + '\t' + cata3(i));
</script></body></html></
{{out}}
<pre> meth1 meth2 meth3
Line 2,631 ⟶ 3,410:
14 2674440 2674440 2674440
15 9694845 9694845 9694845</pre>
===Functional===
Defining an infinite list:
<syntaxhighlight lang="javascript">(() => {
"use strict";
// ----------------- CATALAN NUMBERS -----------------
// catalansDefinitionThree :: [Int]
const catalansDefinitionThree = () =>
// An infinite sequence of Catalan numbers.
scanlGen(
c => n => Math.floor(
(2 * c * pred(2 * n)) / succ(n)
)
)(1)(
enumFrom(1)
);
// ---------------------- TEST -----------------------
// main :: IO ()
const main = () =>
take(15)(
catalansDefinitionThree()
);
// --------------------- GENERIC ---------------------
// enumFrom :: Enum a => a -> [a]
const enumFrom = function* (n) {
// An infinite sequence of integers,
// starting with n.
let v = n;
while (true) {
yield v;
v = 1 + v;
}
};
// pred :: Int -> Int
const pred = x =>
x - 1;
// scanlGen :: (b -> a -> b) -> b -> Gen [a] -> [b]
const scanlGen = f =>
// The series of interim values arising
// from a catamorphism over an infinite list.
startValue => function* (gen) {
let
a = startValue,
x = gen.next();
yield a;
while (!x.done) {
a = f(a)(x.value);
yield a;
x = gen.next();
}
};
// succ :: Int -> Int
const succ = x =>
1 + x;
// take :: Int -> [a] -> [a]
// take :: Int -> String -> String
const take = n =>
// The first n elements of a list,
// string of characters, or stream.
xs => Array.from({
length: n
}, () => {
const x = xs.next();
return x.done ? [] : [x.value];
}).flat();
// MAIN ---
return JSON.stringify(main(), null, 2);
})();</syntaxhighlight>
{{Out}}
<pre>[
1,
1,
2,
5,
14,
42,
132,
429,
1430,
4862,
16796,
58786,
208012,
742900,
2674440
]</pre>
=={{header|jq}}==
Line 2,638 ⟶ 3,525:
that formula is used (a) to define a function for computing a single Catalan number; (b) to define a function for generating a sequence of Catalan numbers; and (c) to write a single expression for generating a sequence of Catalan numbers using jq's builtin "recurse/1" filter.
==== Compute a single Catalan number====
<
if . == 0 then 1
elif . < 0 then error("catalan is not defined on \(.)")
else (2 * (2*. - 1) * ((. - 1) | catalan)) / (. + 1)
end;</
'''Example 1'''
<
{{Out}}
<div style="overflow:scroll; height:150px;">
<
[0,1]
[1,1]
Line 2,665 ⟶ 3,552:
[15,9694845]
[100,8.96519947090131e+56]
</
==== Generate a sequence of Catalan numbers ====
<
def _catalan: # state: [n, catalan(n)]
if .[0] > max then empty
Line 2,676 ⟶ 3,563:
end;
[0,1] | _catalan;
</syntaxhighlight>
'''Example 2''':
<syntaxhighlight lang
{{Out}}
As above for 0 to 15.
==== An expression to generate Catalan numbers ====
<syntaxhighlight lang="jq">
[0,1]
| recurse( if .[0] == 15 then empty
else .[1] as $c | (.[0] + 1) | [ ., (2 * (2*. - 1) * $c) / (. + 1) ]
end )</
{{out}}
As above for 0 to 15.
=={{header|Julia}}==
{{works with|Julia|0.6}}
<
@show catalannum.(1:15)
@show catalannum(big(100))</
{{out}}
Line 2,703 ⟶ 3,589:
(In the second example, we have used arbitrary-precision integers to avoid overflow for large Catalan numbers.)
=={{header|K}}==
<
catalan'!:15
1 1 2 5 14 42 132 429 1430 4862 16796 58786 208012 742900 2674440</
=={{header|Kotlin}}==
{{works with|Java|1.7.0}}
{{works with|Kotlin|1.1.4}}
<
abstract operator fun invoke(n: Int) : Double
Line 2,764 ⟶ 3,648:
println()
}
}</
{{out}}
<pre> 1 1 1
Line 2,782 ⟶ 3,666:
2674440 2674440 2674440
9694845 9694845 9694845</pre>
=={{header|Lambdatalk}}==
{{trans|Javascript}}
<h3>1) catalan1</h3>
<syntaxhighlight lang="scheme">
{def catalan1
{def fac {lambda {:n} {* {S.serie 1 :n}}}}
{lambda {:n}
{floor {+ {/ {fac {* 2 :n}} {fac {+ :n 1}} {fac :n}} 0.5}}}}
-> catalan1
{S.map catalan1 {S.serie 1 15}}
-> 1 1 2 5 14 42 132 429 1430 4862 16796 58786 208012 742900 2674440 9694845
</syntaxhighlight>
<h3>2) catalan2</h3>
<syntaxhighlight lang="scheme">
{def catalan2
{def catalan2.sum
{lambda {:n :a :s :i}
{if {= :i :n}
then {A.set! :n :s :a}
else {catalan2.sum :n
:a
{+ :s {* {catalan2.loop :i :a}
{catalan2.loop {- :n :i 1} :a}}}
{+ :i 1}} }}}
{def catalan2.loop
{lambda {:n :a}
{if {= :n 0}
then 1
else {if {W.equal? {A.get :n :a} undefined}
then {A.get :n {catalan2.sum :n :a 0 0}}
else {A.get :n :a} }}}}
{lambda {:n}
{catalan2.loop :n {A.new}} }}
-> catalan2
{S.map catalan2 {S.serie 0 15}}
-> 1 1 2 5 14 42 132 429 1430 4862 16796 58786 208012 742900 2674440 9694845
</syntaxhighlight>
<h3>3) catalan3</h3>
<syntaxhighlight lang="scheme">
{def catalan3
{def catalan3.loop
{lambda {:n :a}
{if {= :n 0}
then 1
else {if {W.equal? {A.get :n :a} undefined}
then {A.get :n
{A.set! :n
{/ {* {- {* 4 :n} 2}
{catalan3.loop {- :n 1} :a}}
{+ :n 1}}
:a}}
else {A.get :n :a}
}}}}
{lambda {:n}
{catalan3.loop :n {A.new}}}}
-> catalan3
{S.map catalan3 {S.serie 0 15}}
-> 1 1 2 5 14 42 132 429 1430 4862 16796 58786 208012 742900 2674440 9694845
</syntaxhighlight>
<h3>4) Alternative for a vertical diplay</h3>
<syntaxhighlight lang="scheme">
{style
td { text-align:right;
font-family:monospace;
}
}
{table
{tr {td} {td cat1} {td cat2} {td cat3}}
{S.map {lambda {:i} {tr {td :i}
{td {catalan1 :i}}
{td {catalan2 :i}}
{td {catalan3 :i}}}}
{S.serie 0 15}}
}
cat1 cat2 cat3
0 1 1 1
1 1 1 1
2 2 2 2
3 5 5 5
4 14 14 14
5 42 42 42
6 132 132 132
7 429 429 429
8 1430 1430 1430
9 4862 4862 4862
10 16796 16796 16796
11 58786 58786 58786
12 208012 208012 208012
13 742900 742900 742900
14 2674440 2674440 2674440
15 9694845 9694845 9694845
</syntaxhighlight>
=={{header|langur}}==
{{trans|Perl}}
<
val .catalan = fn(.n) { .factorial(2 x .n) / .factorial(.n+1) / .factorial(.n) }
for .i in 0..15 {
Line 2,792 ⟶ 3,786:
}
writeln "10000: ", .catalan(10000)</
{{out}}
Line 2,813 ⟶ 3,807:
10000: 224537812493385215633593584257360578701103586219365887773293713835854436588700534490998102719114320210209905393799589701149327326500953702713977513001838761306936534407802585494454599941773729984591764542782202886796997833276495496514760245912220654267091568311812071300891219894022165175451441066691435091975969499731921675488934120638046514134965974069039677192984714638704528752769863567952620334847707274529741976558104236293861846622622783294667505268651205024766408784881872997404042356319626323351089169906635603513309014645157443570842822082866699012415455339518777770781742052837799476906230350785959040487158118992753484022865373274100095762968510625236915280143408460651206678398725681703811505423791566261735329550627967717189932855983913468867794806585863794483869239933179341394259456515091026456652770409848702116046445406995085092488210998732255656992243441519938747425554228724734242623566663631968254490897214106655375215196762710825001305055093871863518797311135688370964194817463890187212845332422257193414201244344808864449873736345425670715824582633802476282521798739438044652622163657359012681653473214512797365047989922327391063907061792126264420963262176161781711086630089636828211837643128677915076724947168653050318426339007489738275045346257959685376480042860870398232333705506506342394485443047987642390287346746539674780326188825579548593281319807827279403944008553690033855132088140116099772393778770685018936338194366302053586633406848404622048675525765095697363909787189635178694239275237185046710057476484117945279786897787624602379494797322427251542758312638233073625857897083435831841717971137851874666094337671443717108457737153283641719103639784923520519013700030680553564442331411313831920775983175313709250333784211385811480015293165463406576311626295629412110652218717603537723650144357966952842696678735624157616428716812764985074925414219421312810089785108621126934245959900367104035334200067714905754827856122801987429837706493130435832752072139392743006620396370486473952500144779413596417260472218266529167783118015414918168260722824885550181735638670588682513610805160133611349864194033776132438535863120087679096358696928233598996870302136347936567444208209125300149683552369341937471817860835774359234009557030148123353114950735217736514617017504851011193104728986836180908987352236659629183725016607437110422583156042941955830763092095074443334625318588569114114087985404048889671202396824806275701581378689568449507132793603852731445602923990458926101180821029108808623323378547869169352237448925371763574346501610378415722137519019474474794069155118626291447578558908522430436148987521551911541787974276591708584289036595642180860178815462862735993859177180582760389253540408842580225467216988321950591728369194164290645992782274919561096308372635908842325870580231011459216934235078490764707633348336131667313582584404397290232519769625777374165187949140092779343812345117947306771376053099536367169631889642304360871187460737580808157222861127968703067542270175460553478533349238111434409526724363429611803844595968793121871649699680963646793415774160274520010905236593324062464542927011227158945796188186430711399250096518886617184049325827319276468018789191520522185358895653192882843061349706085770767046601045697944646638311930027354235643643713545212361580694059553720806659066661496416423676930095857438882302891350789287291844752601744462789158506243012088536936184422120232369244564444689340142897415432231452353338115944183447986470689449043710051589958391273681116292415738776171575775695905846247205522469202801517417551374761549677412720803623129527503286287755308576386461385928958587649159872019202866614901547860974883963007792442796064165417207167072370586790722366932349325253877744621251386864069101337572557790214048760202008337611577675840153696735860276810033694744314488435390547908483357054897387317002405793108554524629034558098886977538473481750772616164313845337139245688079995996839933620829828339492800825536599964878893947278408890351634126931068657027524005795713514365098086505030570362785115155293306343520969872400876180105031975302255898787642403303027682634969586730202117121076117629457710028105378124677420093990476071697970354661002217702623344454780740808459286778553016318604430682610618871098652904537323336381304469735192868285840882036271136058499391069436145426450229039329475974178236465920534171895204155964515055983303017823692138977622016292722019365841360360274557488926673754175222061483328914099598663902320310143583379354121664996173733086613692927391384486261610892314450463841637667054196985332620403539011932606618414419229492637564924726411270720189611019154677281846409387514072618176832310721327819277699943226895919915049652045449281057471199978267843961724883768772155477073354744908923995448752333726740642292872107500458349718026322755698226793850983280706045951407323891263270928264657562125955511946782954645656015480418543664557515041692091317941000997342935512311493290722434384401250133402934163457264794261787386862382738330195237770190998115114193014769006071380834085352290585937952429981509893303796306071520571655936820282768086579891336876000368502562579738337809071051261343359121744773055264455701014137255399929760233753812017596045145926791136761130783810840502248142803073720015451941006030172192834375431286154255159659778817089767964922549014569972777126726537787896968876337799235679125368824867754881036161730805613471278633981478858113141202728303435218970292775366288829203013873713349923690394124920402725698544786016048685431525811047414746045227535216327530901827040588505255466803793791888002231571686068617764292584075135236237044383334893874602177596602979234717936820827427229615827657960492946059695301906791494260652411424538532836730097985187522379068364429583532675896349363295120431429006688249818006722311568902288350452581968418068616818268667067741994472455501649753611708445979082338902214467454627107888156489438584617793175431865532382711812960546611287516640
</pre>
=={{header|Logo}}==
<
output ifelse [less? :n 1] 1 [product :n factorial difference :n 1]
end
Line 2,938 ⟶ 3,819:
end
repeat 15 [print catalan repcount]</
{{out}}
<pre>
Line 2,956 ⟶ 3,837:
742900
2674440</pre>
=={{header|Logtalk}}==
For this task it is instructive to show a more general-purpose interface for sequences and an implementation of it for Catalan numbers.
First, <code>loader.lgt</code>:
<syntaxhighlight lang="logtalk">
:- initialization((
% libraries
logtalk_load(dates(loader)),
logtalk_load(meta(loader)),
logtalk_load(types(loader)),
% application
logtalk_load(seqp),
logtalk_load(catalan),
logtalk_load(catalan_test)
)).
</syntaxhighlight>
The interface is defined in <code>seqp.lgt</code> as a protocol:
<syntaxhighlight lang="logtalk">
:- protocol(seqp).
:- public(init/0). % reset to a beginning state if meaningful
:- public(nth/2). % get the nth value of the sequence
:- public(to_nth/2). % get from the start to the nth value of the sequence as a list
:- end_protocol.
</syntaxhighlight>
The implementation of a Catalan sequence generator is in <code>catalan.lgt</code>:
<syntaxhighlight lang="logtalk">
:- object(catalan, implements(seqp)).
:- private(catalan/2).
:- dynamic(catalan/2).
% Public interface.
init :- retractall(catalan(_,_)). % flush any memoized results
nth(N, V) :- \+ catalan(N, V), catalan_(N, V), !. % generate iff it's not been memoized
nth(N, V) :- catalan(N, V), !. % otherwise use the memoized version
to_nth(N, L) :-
integer::sequence(0, N, S), % generate a list of 0 to N
meta::map(nth, S, L). % map the nth/2 predicate to the list for all Catalan numbers up to N
% Local helper predicates.
catalan_(N, V) :-
N > 0, % calculate
N1 is N - 1,
N2 is N + 1,
catalan_(N1, V1), % via a recursive call
V is V1 * 2 * (2 * N - 1) // N2,
assertz(catalan(N, V)). % and memoize the result
catalan_(0, 1).
:- end_object.
</syntaxhighlight>
This is a memoizing implementation whose impact we will check in the test. The <code>init/0</code> predicate flushes any memoized results.
The test driver is a simple one that generates the first fifteen Catalan numbers four times, comparing times with and without memoization. From <code>catalan_test.lgt</code>:
<syntaxhighlight lang="logtalk">
:- object(catalan_test).
:- public(run/0).
run :-
% put the object into a known initial state
catalan::init,
% first 15 Catalan numbers, record duration.
time_operation(catalan::to_nth(15, C1), D1),
% first 15 Catalan numbers again, twice, recording duration.
time_operation(catalan::to_nth(15, C2), D2),
time_operation(catalan::to_nth(15, C3), D3),
% reset the object again
catalan::init,
% first 15 Catalan numbers, record duration.
time_operation(catalan::to_nth(15, C4), D4),
% ensure the results were the same each time
C1 = C2, C2 = C3, C3 = C4,
% write the results and durations of each run
write(C1), write(' '), write(D1), nl,
write(C2), write(' '), write(D2), nl,
write(C3), write(' '), write(D3), nl,
write(C4), write(' '), write(D4), nl.
% visual inspection should show all results the same
% first and final durations should be much larger
:- meta_predicate(time_operation(0, *)).
time_operation(Goal, Duration) :-
time::cpu_time(Before),
call(Goal),
time::cpu_time(After),
Duration is After - Before.
:- end_object.
</syntaxhighlight>
{{Out}}
The session at the top-level looks like this:
<pre>
?- {loader}.
% ... messages elided ...
% (0 warnings)
true.
?- catalan_test::run.
[1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012,742900,2674440,9694845] 0.001603
[1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012,742900,2674440,9694845] 0.000306
[1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012,742900,2674440,9694845] 0.00026
[1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012,742900,2674440,9694845] 0.001346
true.
</pre>
This test shows:
# The <code>nth/2</code> predicate works (since <code>to_nth/2</code> is implemented in terms of it).
# The <code>to_nth/2</code> predicate works.
# Memoization generates a speedup of between ~4.5× to ~6.2× over generating from scratch.
=={{header|Lua}}==
<
local catalan = { [0] = 1 }
setmetatable(catalan, {
for i = 0, 14 do
end</
{{out}}
<pre>1
1
2
Line 2,991 ⟶ 4,007:
=={{header|MAD}}==
<
DIMENSION C(15)
Line 3,002 ⟶ 4,018:
VECTOR VALUES CFMT=$2HC(,I2,4H) = ,I7*$
END OF PROGRAM </
{{out}}
Line 3,021 ⟶ 4,037:
C(13) = 742900
C(14) = 2674440</pre>
=={{header|Maple}}==
<
return seq( (2*i)!/((i + 1)!*i!), i = 0 .. n - 1 );
end proc:
CatalanNumbers(15);
</syntaxhighlight>
Output:
<pre>
1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440
</pre>
=={{header|Mathematica}} / {{header|Wolfram Language}}==
<
{{out|Sample Output}}
<
//TableForm=
1
Line 3,053 ⟶ 4,067:
742900
2674440
9694845</
=={{header|MATLAB}} / {{header|Octave}}==
<
for i = (1:length(n))
n(i) = (1/(n(i)+1))*nchoosek(2*n(i),n(i));
end
end</
The following version computes at the same time the n first Catalan numbers (including C0).
<
n = [1 cumprod((2:4:4*n-6) ./ (2:n))];
end</
{{out|Sample Output}}
<
ans =
Line 3,093 ⟶ 4,106:
9694845
35357670
129644790</
The following version uses the identity Ln(x!)=Gammaln(x+1) and prod(1:x)=sum(ln(1:x))
<syntaxhighlight lang="matlab">
CatalanNumber=@(n) round(exp(gammaln(2*n+1)-sum(gammaln([n+2 n+1]))));
</syntaxhighlight>
{{out|Sample Output}}
<
ans =
Line 3,111 ⟶ 4,124:
'6564120420'
</syntaxhighlight>
=={{header|Maxima}}==
<
cata[n] := sum(cata[i]*cata[n - 1 - i], i, 0, n - 1)$
cata[0]: 1$
Line 3,123 ⟶ 4,136:
makelist(cata2(n), n, 0, 14);
/* both return [1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440] */</
=={{header|Miranda}}==
<syntaxhighlight lang="miranda">main :: [sys_message]
main = [Stdout (lay (map (show . catalan) [0..14]))]
catalan :: num->num
catalan 0 = 1
catalan n = (4*n - 2) * catalan (n - 1) div (n + 1)</syntaxhighlight>
{{out}}
<pre>1
1
2
5
14
42
132
429
1430
4862
16796
58786
208012
742900
2674440</pre>
=={{header|Modula-2}}==
<
FROM FormatString IMPORT FormatString;
FROM Terminal IMPORT WriteString,WriteLn,ReadChar;
Line 3,190 ⟶ 4,226:
END;
ReadChar
END CatalanNumbers.</
=={{header|Nim}}==
<
import strformat
Line 3,210 ⟶ 4,246:
for i in 0..15:
echo &"{i:7} {catalan1(i):7} {catalan2(i):7} {catalan3(i):7}"</
{{out}}
Line 3,229 ⟶ 4,265:
14 2674440 2674440 2674440
15 9694845 9694845 9694845</pre>
=={{header|OCaml}}==
<
let return = ref 1 in
for i = 1 to n do
Line 3,285 ⟶ 4,320:
"memoized", (memoize catalan)];
show imp_catalan catalan memo_catalan (memoize catalan) 15
</syntaxhighlight>
{{out}}
<pre>$ ocaml unix.cma catalan.ml
Line 3,316 ⟶ 4,351:
memoized (10000000 runs) : 0.167
...</pre>
=={{header|Oforth}}==
<
n ifZero: [ 1 ] else: [ catalan( n 1- ) 2 n * 1- * 2 * n 1+ / ] ;</
{{out}}
Line 3,328 ⟶ 4,362:
[1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845]
</pre>
=={{header|ooRexx}}==
Three versions of this.
<
say "catI("i") =" .catalan~catI(i)
say "catR1("i") =" .catalan~catR1(i)
Line 3,411 ⟶ 4,444:
catR2[n] = res
end
return res</
{{out}}
<pre>catI(0) = 1
Line 3,461 ⟶ 4,494:
catR1(15) = 9694845
catR2(15) = 9694845</pre>
=={{header|PARI/GP}}==
Memoization is not worthwhile; PARI has fast built-in facilities for calculating binomial coefficients and factorials.
<
A second version:
<
Naive version with binary splitting:
<
Naive version:
<
my(t=1);
for(k=n+2,2*n,t*=k);
for(k=2,n,t/=k);
t
};</
The first version takes about 1.5 seconds to compute the millionth Catalan number, while the second takes 3.9 seconds. The naive implementations, for comparison, take 21 and 45 minutes. In any case, printing the first 15 is simple:
<
=={{header|Pascal}}==
<
function catalanNumber1(n: integer): double;
Line 3,498 ⟶ 4,529:
for number := 0 to 14 do
writeln (number:3, round(catalanNumber1(number)):9);
end.</
{{out}}
<pre>
Line 3,520 ⟶ 4,551:
14 2674440
</pre>
=={{header|Perl}}==
<
sub catalan {
my $n = shift;
Line 3,528 ⟶ 4,558:
}
print "$_\t@{[ catalan($_) ]}\n" for 0 .. 20;</
For computing up to 20 ish, memoization is not needed. For much bigger numbers, this is faster:
<
sub catalan {
use bigint;
Line 3,537 ⟶ 4,567:
# most of the time is spent displaying the long numbers, actually
print "$_\t", catalan($_), "\n" for 0 .. 10000;</
That has two downsides: high memory use and slow access to an isolated large value. Using a fast binomial function can solve both these issues. The downside here is if the platform doesn't have the GMP library then binomials won't be fast.
{{libheader|ntheory}}
<
sub catalan {
my $n = shift;
binomial(2*$n,$n)/($n+1);
}
print "$_\t", catalan($_), "\n" for 0 .. 10000;</
=={{header|Phix}}==
See also [[Catalan_numbers/Pascal%27s_triangle#Phix]] which may be faster.
<!--<
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #000080;font-style:italic;">-- returns inf/-nan for n>85, and needs the rounding for n>=14, accurate to n=29</span>
Line 3,589 ⟶ 4,618:
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"times:%8s %10s %10s\n"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">times</span><span style="color: #0000FF;">)</span>
<!--</
{{out}}
<pre>
Line 3,614 ⟶ 4,643:
=== memoized recursive gmp version ===
{{libheader|Phix/mpfr}}
<!--<
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">include</span> <span style="color: #000000;">builtins</span><span style="color: #0000FF;">\</span><span style="color: #004080;">mpfr</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
Line 3,645 ⟶ 4,674:
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"0..15: %s\n"</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #008000;">","</span><span style="color: #0000FF;">))</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"100: %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #7060A8;">mpz_get_str</span><span style="color: #0000FF;">(</span><span style="color: #000000;">catalan2m</span><span style="color: #0000FF;">(</span><span style="color: #000000;">100</span><span style="color: #0000FF;">))})</span>
<!--</
{{out}}
<pre>
Line 3,651 ⟶ 4,680:
100: 896519947090131496687170070074100632420837521538745909320
</pre>
=={{header|PHP}}==
<
class CatalanNumbersSerie
Line 3,685 ⟶ 4,713:
echo "$i = $r\r\n";
}
?></
{{out}}
<pre>
Line 3,705 ⟶ 4,733:
15 = 9694845
</pre>
<
<?php
$n = 15;
Line 3,719 ⟶ 4,747:
print ($t[$i+1]-$t[$i])."\t";
}
</syntaxhighlight>
{{out}}
<pre>
1 2 5 14 42 132 429 1430 4862 16796 58786 208012 742900 2674440 9694845 35357670
</pre>
=={{header|Picat}}==
{{works with|Picat}}
<syntaxhighlight lang="picat">
table
factorial(0) = 1.
factorial(N) = N * factorial(N - 1).
catalan1(N) = factorial(2 * N) // (factorial(N + 1) * factorial(N)).
catalan2(0) = 1.
catalan2(N) = 2 * (2 * N - 1) * catalan2(N - 1) // (N + 1).
main =>
foreach (I in 0..14)
printf("%d. %d = %d\n", I, catalan1(I), catalan2(I))
end.
</syntaxhighlight>
{{out}}
<pre>
0. 1 = 1
1. 1 = 1
2. 2 = 2
3. 5 = 5
4. 14 = 14
5. 42 = 42
6. 132 = 132
7. 429 = 429
8. 1430 = 1430
9. 4862 = 4862
10. 16796 = 16796
11. 58786 = 58786
12. 208012 = 208012
13. 742900 = 742900
14. 2674440 = 2674440
</pre>
=={{header|PicoLisp}}==
<
(de fact (N)
(if (=0 N)
Line 3,758 ⟶ 4,822:
(catalanDir N)
(catalanRec N)
(catalanAlt N) ) )</
{{out}}
<pre> 0 => 1 1 1
Line 3,775 ⟶ 4,839:
13 => 742900 742900 742900
14 => 2674440 2674440 2674440</pre>
=={{header|PL/0}}==
{{trans|Tiny BASIC}}
Integers are limited to 32767 so only the first ten Catalan numbers can be represented. To avoid internal overflow, the program subtracts something clever from <code>c</code> and then adds it back at the end.
<syntaxhighlight lang="pascal">
var n, c, i;
begin
n := 0; c := 1;
! c;
while n <= 9 do
begin
n := n + 1;
i := 0;
while c > 0 do
begin
c := c - (n + 1);
i := i + 1
end;
c := 2 * (2 * n - 1) * c / (n + 1);
c := c + 2 * i * (2 * n - 1);
! c
end;
end.
</syntaxhighlight>
{{out}}
<pre>
1
1
2
5
14
42
132
429
1430
4862
16796
</pre>
=={{header|PL/I}}==
<
declare (i, n) fixed;
Line 3,795 ⟶ 4,897:
end c;
end catalan;</
{{out}}
<pre>
Line 3,822 ⟶ 4,924:
6564120420
</pre>
=={{header|PlainTeX}}==
<
\newcount\r
\newcount\x
Line 3,845 ⟶ 4,946:
\advance\x by 1\ifnum\x<15\repeat
\bye</
=={{header|PowerShell}}==
<syntaxhighlight lang="powershell">
function Catalan([uint64]$m) {
function fact([bigint]$n) {
Line 3,859 ⟶ 4,959:
}
0..15 | foreach {"catalan($_): $(catalan $_)"}
</syntaxhighlight>
<b>Output:</b>
<pre>
Line 3,882 ⟶ 4,982:
===An Alternate Version===
This version could easily be modified to work with big integers.
<syntaxhighlight lang="powershell">
function Get-CatalanNumber
{
Line 3,934 ⟶ 5,034:
}
}
</syntaxhighlight>
Get the first fifteen Catalan numbers as a PSCustomObject:
<syntaxhighlight lang="powershell">
0..14 | Get-CatalanNumber
</syntaxhighlight>
{{Out}}
<pre>
Line 3,960 ⟶ 5,060:
</pre>
To return only the array of Catalan numbers:
<syntaxhighlight lang="powershell">
(0..14 | Get-CatalanNumber).CatalanNumber
</syntaxhighlight>
{{Out}}
<pre>
Line 3,981 ⟶ 5,081:
2674440
</pre>
=={{header|Prolog}}==
{{Works with|SWI-Prolog}}
<
length(L1, N),
L = [1 | L1],
Line 4,000 ⟶ 5,099:
my_write(N, V) :-
format('~w : ~w~n', [N, V]).</
{{out}}
<pre> ?- catalan(15).
Line 4,020 ⟶ 5,119:
15 : 9694845
true .
</pre>
Line 4,092 ⟶ 5,127:
{{Works with|Python|3}}
<
import functools
Line 4,140 ⟶ 5,175:
defs = (cat_direct, catR1, catR2)
results = [tuple(c(i) for i in range(15)) for c in defs]
pr(results)</
{{out|Sample Output}}
<pre>CAT_DIRECT CATR1 CATR2
Line 4,162 ⟶ 5,197:
The third definition is directly expressible, as an infinite series, in terms of '''itertools.accumulate''':
<
from itertools import accumulate, chain, count, islice
Line 4,208 ⟶ 5,243:
# MAIN ---
if __name__ == '__main__':
main()</
{{Out}}
<pre>Catalans 1-15:
Line 4,227 ⟶ 5,262:
742900
2674440</pre>
=={{header|Quackery}}==
<
[ times [ i 1+ / ] ] is /n! ( n --> n )
Line 4,236 ⟶ 5,270:
[ dup 2n!/n! swap 1+ /n! ] is catalan ( n --> n )
15 times [ i^ dup echo say " : " catalan echo cr ]</
{{out}}
Line 4,256 ⟶ 5,290:
14 : 2674440
</pre>
=={{header|R}}==
<
catalan(0:15)
[1] 1 1 2 5 14 42 132 429 1430
[10] 4862 16796 58786 208012 742900 2674440 9694845</
=={{header|Racket}}==
<
(require planet2)
; (install "this-and-that") ; uncomment to install
Line 4,275 ⟶ 5,307:
(* (catalan i) (catalan (- m i 1))))))
(map catalan (range 1 15))</
{{out}}
<pre>
'(1 2 5 14 42 132 429 1430 4862 16796 58786 208012 742900 2674440)
</pre>
=={{header|Raku}}==
(formerly Perl 6)
Line 4,286 ⟶ 5,317:
The recursive formulas are easily written into a constant array, either:
<syntaxhighlight lang="raku"
or
<syntaxhighlight lang="raku"
# In both cases, the sixteen first values can be seen with:
.say for Catalan[^16];</
{{out}}
<pre>1
Line 4,311 ⟶ 5,342:
742900
2674440</pre>
=={{header|REXX}}==
===version 1===
Line 4,321 ⟶ 5,351:
has been rearranged to:
:::::::: <big> (n+1) * [fact(n) **2] </big>
<
parse arg LO HI . /*obtain optional arguments from the CL*/
if LO=='' | LO=="," then do; HI=15; LO=0; end /*No args? Then use a range of 0 ──► 15*/
Line 4,343 ⟶ 5,373:
Cat2: procedure expose c.; parse arg n; $=0; if c.n\==. then return c.n
do k=0 for n; $=$ + Cat2(k) * Cat2(n-k-1); end
c.n=$; return $ /*use a memoization technique.*/</
'''output''' when using the input of: <tt> 0 16 </tt>
<pre>
Line 4,388 ⟶ 5,418:
===version 2===
Implements the 3 methods shown in the task description
<
* 01.07.2014 Walter Pachl
*--------------------------------------------------------------------*/
Line 4,438 ⟶ 5,468:
f=f*i
End
Return f</
{{out}}
<pre> n c1.n c2.n c3.n
Line 4,463 ⟶ 5,493:
20 6564120420 6564120420 6564120420
n c1.n c2.n c3.n</pre>
=={{header|Ring}}==
<
for n = 1 to 15
see catalan(n) + nl
Line 4,474 ⟶ 5,503:
cat = 2 * (2 * n - 1) * catalan(n - 1) / (n + 1)
return cat
</syntaxhighlight>
Output:
<pre>
Line 4,492 ⟶ 5,521:
2674440
9694845
</pre>
=={{header|RPL}}==
{{works with|Halcyon Calc|4.2.7}}
{| class="wikitable"
! Code
! Comments
|-
|
≪
'''IFERR''' R→B '''THEN END'''
'''IF''' DUP #1 ≠
'''THEN'''
DUP 2 * 1 - 2 * OVER 1 - →CAT * SWAP 1 + /
'''END'''
≫ ''''→CAT'''' STO
|
''( n -- C(n) )''
Ignore the conversion error if n is already a binary integer
C(1) = 1
Divide by (n+1) at the end to stay in the integer world
|}
To speed up execution, additions can be preferred to multiplications by replacing <code>2 *</code> with <code>DUP +</code>.
The following piece of code will deliver what is required:
≪ 1 { } '''DO''' OVER →CAT B→R + SWAP 1 + SWAP '''UNTIL''' OVER 15 > '''END''' ≫ EVAL
{{out}}
<pre>
1: { 1 2 5 14 42 132 429 1430 4862 16796 58786 208012 742900 2674440 9694845 }
</pre>
=={{header|Ruby}}==
<syntaxhighlight lang="ruby">def factorial(n)
(1..n).reduce(1, :*)
end
Line 4,510 ⟶ 5,568:
def catalan_rec1(n)
return 1 if n == 0
(0...n).
end
Line 4,534 ⟶ 5,592:
puts "\n direct rec1 rec2"
16.times {|n| puts "%2d :%9d%9d%9d" % [n, catalan_direct(n), catalan_rec1(n), catalan_rec2(n)]}</
The output shows the dramatic difference memoizing makes.
<pre>
Line 4,561 ⟶ 5,619:
15 : 9694845 9694845 9694845
</pre>
=={{header|Rust}}==
<
match n {
0 => 1,
Line 4,599 ⟶ 5,632:
println!("c_n({}) = {}", i, c_n(i));
}
}</
{{out}}
Line 4,618 ⟶ 5,651:
c(14) = 2674440
c(15) = 9694845</pre>
=={{header|Scala}}==
Simple and straightforward. Noticeably out of steam without memoizing at about 5000.
<
object CatalanNumbers {
def main(args: Array[String]): Unit = {
Line 4,634 ⟶ 5,666:
def factorial(n: BigInt): BigInt = BigInt(1).to(n).foldLeft(BigInt(1))(_ * _)
}
</syntaxhighlight>
{{out}}
<pre>
Line 4,654 ⟶ 5,686:
catalan(15) = 9694845
</pre>
=={{header|Scheme}}==
Tail recursive implementation.
<
(let loop ((c 1)(n 0))
(if (not (eqv? n m))
Line 4,664 ⟶ 5,695:
(loop (* (/ (* 2 (- (* 2 (+ n 1)) 1)) (+ (+ n 1) 1)) c) (+ n 1) )))))
(catalan 15)</
{{out}}
<pre>0: 1
Line 4,681 ⟶ 5,712:
13: 742900
14: 2674440</pre>
=={{header|Seed7}}==
<
include "bigint.s7i";
Line 4,693 ⟶ 5,723:
writeln((2_ * n) ! n div succ(n));
end for;
end func;</
{{out}}
<pre>
Line 4,713 ⟶ 5,743:
9694845
</pre>
=={{header|Sidef}}==
<
func c(n) { f(2*n) / f(n) / f(n+1) }</
With memoization:
<
n == 0 ? 1 : (c(n-1) * (4 * n - 2) / (n + 1))
}</
Calling the function:
<
say "#{i}\t#{c(i)}"
}</
{{out}}
<pre>
Line 4,744 ⟶ 5,773:
14 2674440
</pre>
=={{header|Standard ML}}==
<
* val catalan : int -> int
* Returns the nth Catalan number.
Line 4,810 ⟶ 5,806:
* 2674440
* 9694845
*)</
=={{header|Stata}}==
<
set obs 15
gen catalan=1 in 1
replace catalan=catalan[_n-1]*2*(2*_n-3)/_n in 2/l
list, noobs noh</
'''Output'''
Line 4,841 ⟶ 5,836:
| 2674440 |
+---------+</pre>
=={{header|Swift}}==
{{trans|Rust}}
<
switch n {
case 0:
Line 4,857 ⟶ 5,851:
print("catalan(\(i)) => \(catalan(i))")
}
</syntaxhighlight>
{{out}}
Line 4,877 ⟶ 5,871:
catalan(15) => 9694845
</pre>
=={{header|Tcl}}==
<
# Memoization wrapper
Line 4,897 ⟶ 5,890:
$n == 0 ? 1 : 2 * (2*$n - 1) * catalan($n - 1) / ($n + 1)
}}
}</
Demonstration:
<
puts "C_$i = [expr {catalan($i)}]"
}</
{{out}}
<pre>
Line 4,929 ⟶ 5,922:
</pre>
== {{header|
{{trans|GW-BASIC}}
<syntaxhighlight lang="javascript">
// Catalan numbers
var c: number[] = [1];
console.log(`${0}\t${c[0]}`);
for (n = 0; n < 15; n++) {
c[n + 1] = 0;
for (i = 0; i <= n; i++)
c[n + 1] = c[n + 1] + c[i] * c[n - i];
console.log(`${n + 1}\t${c[n + 1]}`);
}
</syntaxhighlight>
{{out}}
<pre>
0 1
1 1
2 2
3 5
4 14
5 42
6 132
7 429
8 1430
9 4862
10 16796
11 58786
12 208012
13 742900
14 2674440
15 9694845
</pre>
=={{header|Ursala}}==
<
#import nat
Line 4,960 ⟶ 5,963:
#cast %nL
t = catalan* iota 16</
{{out}}
<pre><
Line 4,979 ⟶ 5,982:
2674440,
9694845></pre>
=={{header|Vala}}==
<
public class CatalanNumberGenerator {
private static double factorial(double n) {
Line 5,057 ⟶ 6,059:
}
}</
{{out}}
<pre>
Line 5,127 ⟶ 6,129:
</pre>
=={{header|
{{trans|Go}}
<syntaxhighlight lang="v (vlang)">import math.big
fn main() {
mut b:= big.zero_int
b = big.integer_from_i64(n)
b = (b*big.two_int).factorial()/(b.factorial()*(b*big.two_int-b).factorial())
println(b/big.integer_from_i64(n+1))
}</syntaxhighlight>
{{out}}
<pre>
1
1
2
5
14
42
132
429
1430
4862
16796
58786
208012
742900
2674440
</pre>
=={{header|Wortel}}==
<
#~ddiFSFmSoFSn
; which stands for: dup dup inc fac swap fac mult swap double fac swap divide
; to get the first 15 Catalan numbers we map this function over a list from 0 to 15
!*#~ddiFSFmSoFSn @til 15
; returns [1 1 2 5 14 42 132 429 1430 4862 16796 58786 208012 742900 2674439.9999999995]</
=={{header|Wren}}==
{{libheader|Wren-fmt}}
{{libheader|Wren-math}}
<
import "./math" for Int
var catalan = Fn.new { |n|
Line 5,394 ⟶ 6,191:
for (i in 0..15) System.print("%(Fmt.d(2, i)) %(catalan.call(i))")
System.print("\nand again using a recursive function:\n")
for (i in 0..15) System.print("%(Fmt.d(2, i)) %(catalanRec.call(i))")</
{{out}}
Line 5,436 ⟶ 6,233:
15 9694845
</pre>
=={{header|XLISP}}==
<
(if (= n 0)
1
Line 5,449 ⟶ 6,245:
(range (+ x 1) y) ) ) )
(print (mapcar catalan (range 0 14)))</
{{out}}
<pre>(1 1 2 5 14 42 132 429 1430 4862 16796 58786 208012 742900 2674440)</pre>
=={{header|XPL0}}==
<
int C, N;
[C:= 1;
Line 5,462 ⟶ 6,257:
IntOut(0, C); CrLf(0);
];
]</
{{out}}
<pre>
Line 5,484 ⟶ 6,279:
=={{header|zkl}}==
Uses GMP to calculate big factorials.
<
fcn catalan(n){
BN(2*n).factorial() / BN(n+1).factorial() / BN(n).factorial();
Line 5,492 ⟶ 6,287:
println("%2d --> %,d".fmt(n, catalan(n)));
}
println("%2d --> %,d".fmt(100, catalan(100)));</
And an iterative solution at works up to the limit of 64 bit ints (n=33). Would be 35 but need to avoid factional intermediate results.
<
{{out}}
<pre>
Line 5,515 ⟶ 6,310:
100 --> 896,519,947,090,131,496,687,170,070,074,100,632,420,837,521,538,745,909,320
</pre>
=={{header|ZX Spectrum Basic}}==
{{trans|C}}
<
20 LET n=i: LET m=2*n
30 LET r=1: LET d=m-n
Line 5,530 ⟶ 6,324:
110 STOP
120 DEF FN m(a,b)=a-INT (a/b)*b: REM Modulus function
</syntaxhighlight>
|