Sudan function: Difference between revisions

added RPL
(Add Factor)
(added RPL)
 
(37 intermediate revisions by 20 users not shown)
Line 7:
The Sudan function is usually defined as follows ([https://wikimedia.org/api/rest_v1/media/math/render/svg/59304f0b3ff0baad7dd21f5ce16ce6fa241111a2 svg]):
 
<math>\begin{array}{lll}
<pre>
<big>
:<math>\begin{array}{lll}
F_0 (x, y) & = x+y \\
F_{n+1} (x, 0) & = x & \text{if } n \ge 0 \\
Line 15 ⟶ 13:
\end{array}
</math>
</big>
</pre>
 
;Task:
Write a function which returns the value of F(x, y).
 
=={{header|8080 Assembly}}==
<syntaxhighlight lang="asm8080"> org 100h
jmp demo
;; Sudan function. BC=N, DE=X, HL=Y; output in HL.
sudan: mov a,b ; N=0?
ora c
jz sdnbse
mov a,h ; Y=0?
ora l
jz sdnbse
push b ; Save N and Y (we don't need X)
push h
dcx h
call sudan ; Calculate result of inner call
xchg ; Set X = result of inner call
pop h ; Get Y
dad d ; Set Y = Y + result of inner call
pop b ; Get N
dcx b ; N = N-1
jmp sudan ; Calculate result of outer call
sdnbse: dad d ; Return X+Y (base case)
ret
 
;; Output routine (show 'sudan(N,X,Y) = value'), using CP/M call
show: push h! push d! push b! ; Copies of args
push h! push d! push b! ; For output
lxi d,sdt! call pstr ; Print call
pop h! call prhl
lxi d,sdc! call pstr
pop h! call prhl
lxi d,sdc! call pstr
pop h! call prhl
lxi d,sdi! call pstr
pop b! pop d! pop h! ; Restore args
call sudan! call prhl ; Find and print result
lxi d,sdnl! jmp pstr
prhl: lxi d,numbuf! push d! lxi b,-10
prdgt: lxi d,-1
pdiv: inx d! dad b! jc pdiv
mvi a,'0'+10! add l! pop h
dcx h! mov m,a! push h
xchg! mov a,h! ora l! jnz prdgt
pop d
pstr: mvi c,9! jmp 5
 
;; Set up big system stack (using CP/M)
demo: lhld 6
sphl
;; Show a couple of values
lxi b,0! lxi d,0! lxi h,0! call show
lxi b,1! lxi d,1! lxi h,1! call show
lxi b,2! lxi d,1! lxi h,1! call show
lxi b,3! lxi d,1! lxi h,1! call show
lxi b,2! lxi d,2! lxi h,1! call show
rst 0
sdt: db 'sudan($'
sdc: db ', $'
sdi: db ') = $'
db '.....'
numbuf: db '$'
sdnl: db 13,10,'$'</syntaxhighlight>
{{out}}
<pre>sudan(0, 0, 0) = 0
sudan(1, 1, 1) = 3
sudan(2, 1, 1) = 8
sudan(3, 1, 1) = 10228
sudan(2, 2, 1) = 27</pre>
 
=={{header|Ada}}==
{{trans|Javascript}}
<langsyntaxhighlight Adalang="ada">with Ada.Text_IO; use Ada.Text_IO;
 
procedure Sudan_Function is
Line 41 ⟶ 105:
Put_Line ("F2 (2, 1) = " & F (2, 2, 1)'Image);
Put_Line ("F3 (1, 1) = " & F (3, 1, 1)'Image);
end Sudan_Function;</langsyntaxhighlight>
{{out}}
<pre>
Line 55 ⟶ 119:
{{Trans|Wren}}
...with a minor optimisation.
<langsyntaxhighlight lang="algol68">BEGIN # compute some values of the Sudan function #
PROC sudan = ( INT n, x, y )INT:
IF n = 0 THEN x + y
Line 80 ⟶ 144:
print( ( "F(3, 1, 1) = ", whole( sudan( 3, 1, 1 ), 0 ), newline ) );
print( ( "F(2, 2, 1) = ", whole( sudan( 2, 2, 1 ), 0 ), newline ) )
END</langsyntaxhighlight>
{{out}}
<pre>
Line 110 ⟶ 174:
F(2, 2, 1) = 27
</pre>
=={{header|APL}}==
<syntaxhighlight lang="apl"> sudan←{
0∨.>⍺ ⍺⍺ ⍵:'Negative input'⎕SIGNAL 11
⍺⍺=0:⍺+⍵
⍵=0:⍺
tm((⍺⍺-1)∇∇)⍵+tm←⍺∇⍵-1
}</syntaxhighlight>
{{out}}
<pre> 0 sudan/¨ ¯1+⍳ 6 7
0 1 2 3 4 5 6
1 2 3 4 5 6 7
2 3 4 5 6 7 8
3 4 5 6 7 8 9
4 5 6 7 8 9 10
5 6 7 8 9 10 11
1 sudan/¨ ¯1+⍳ 6 7
0 1 4 11 26 57 120
1 3 8 19 42 89 184
2 5 12 27 58 121 248
3 7 16 35 74 153 312
4 9 20 43 90 185 376
5 11 24 51 106 217 440
1 (2 sudan) 1
8
1 (3 sudan) 1
10228
2 (2 sudan) 1
27</pre>
 
=={{header|Arturo}}==
<syntaxhighlight lang="arturo">sudan: function [n, x, y][
if n = 0 -> return x + y
if y = 0 -> return x
 
sudan n-1 sudan n x y-1 y + sudan n x y-1
]
 
print sudan 1 3 3</syntaxhighlight>
 
{{out}}
 
<pre>35</pre>
 
=={{header|AWK}}==
<syntaxhighlight lang="awk">
<lang AWK>
# syntax: GAWK -f SUDAN_FUNCTION.AWK
BEGIN {
Line 144 ⟶ 251:
return(new_str)
}
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 178 ⟶ 285:
==={{header|BASIC256}}===
{{trans|FreeBASIC}}
<langsyntaxhighlight lang="freebasic">for n = 0 to 1
print "Values of F(" & n & ", x, y):"
print "y/x 0 1 2 3 4 5"
Line 201 ⟶ 308:
if y = 0 then return x
return F(n - 1, F(n, x, y - 1), F(n, x, y - 1) + y)
end function</langsyntaxhighlight>
{{out}}
<pre>Same as FreeBASIC entry.</pre>
 
==={{header|Gambas}}===
{{trans|FreeBASIC}}
<syntaxhighlight lang="vbnet">Function F(n As Integer, x As Integer, y As Integer) As Integer
If n = 0 Then Return x + y
If y = 0 Then Return x
Return F(n - 1, F(n, x, y - 1), F(n, x, y - 1) + y)
End Function
 
Public Sub Main()
Dim n, x, y As Integer
 
For n = 0 To 1
Print " Values of F(" & n & ", x, y):"
Print " y/x 0 1 2 3 4 5"
Print String(29, "-") 'Print " ----------------------------"
For y = 0 To 6
Print y; " | ";
For x = 0 To 5
Print Format$(F(n, x, y), "####");
Next
Print
Next
Print
Next
Print "F(2,1,1) = "; F(2, 1, 1)
Print "F(3,1,1) = "; F(3, 1, 1)
Print "F(2,2,1) = "; F(2, 2, 1)
End </syntaxhighlight>
{{out}}
<pre>Same as FreeBASIC entry.</pre>
 
==={{header|PureBasic}}===
<langsyntaxhighlight PureBasiclang="purebasic">Procedure.d F(n.i, x.i, y.i)
If n = 0
ProcedureReturn x + y
Line 235 ⟶ 378:
PrintN("F(2,2,1) = " + Str(F(2,2,1)))
Input()
CloseConsole()</langsyntaxhighlight>
{{out}}
<pre>Similat to FreeBASIC entry.</pre>
 
==={{header|QBasic}}===
{{works with|QBasic|1.1}}
{{works with|QuickBasic|4.5}}
{{works with|Just BASIC}}
{{works with|Liberty BASIC}}
{{works with|Run BASIC}}
{{works with|True BASIC}}
<syntaxhighlight lang="qbasic">FUNCTION F(n,x,y)
IF n = 0 THEN
LET F = x + y
ELSE
IF y = 0 THEN
LET F = x
ELSE
LET F = F(n - 1, F(n, x, y - 1), F(n, x, y - 1) + y)
END IF
END IF
END FUNCTION
 
PRINT "F(2,1,1) = "; F(2, 1, 1)
PRINT "F(3,1,1) = "; F(3, 1, 1)
PRINT "F(2,2,1) = "; F(2, 2, 1)
END</syntaxhighlight>
 
==={{header|Run BASIC}}===
{{works with|Just BASIC}}
{{works with|Liberty BASIC}}
{{works with|QBasic}}
{{works with|True BASIC}}
<syntaxhighlight lang="vb">FUNCTION F(n,x,y)
IF n = 0 THEN
LET F = x + y
ELSE
IF y = 0 THEN
LET F = x
ELSE
LET F = F(n - 1, F(n, x, y - 1), F(n, x, y - 1) + y)
END IF
END IF
END FUNCTION
 
PRINT "F(2,1,1) = "; F(2, 1, 1)
PRINT "F(3,1,1) = "; F(3, 1, 1)
PRINT "F(2,2,1) = "; F(2, 2, 1)
END</syntaxhighlight>
 
==={{header|True BASIC}}===
{{works with|Just BASIC}}
{{works with|Liberty BASIC}}
{{works with|QBasic}}
{{works with|Run BASIC}}
<syntaxhighlight lang="qbasic">FUNCTION F(n,x,y)
IF n = 0 THEN
LET F = x + y
ELSE
IF y = 0 THEN
LET F = x
ELSE
LET F = F(n - 1, F(n, x, y - 1), F(n, x, y - 1) + y)
END IF
END IF
END FUNCTION
 
PRINT "F(2,1,1) = "; F(2, 1, 1)
PRINT "F(3,1,1) = "; F(3, 1, 1)
PRINT "F(2,2,1) = "; F(2, 2, 1)
END</syntaxhighlight>
 
==={{header|XBasic}}===
{{works with|Windows XBasic}}
<syntaxhighlight lang="qbasic">PROGRAM "Sudan function"
VERSION "0.0000"
 
DECLARE FUNCTION Entry ()
DECLARE FUNCTION F (n, x, y)
 
FUNCTION Entry ()
FOR n = 0 TO 1
PRINT " Values of F("; n; ", x, y ):"
PRINT " y/x 0 1 2 3 4 5"
PRINT " ----------------------------"
FOR y = 0 TO 6
PRINT y; " |";
FOR x = 0 TO 5
PRINT FORMAT$("####", F(n, x, y));
NEXT x
PRINT
NEXT y
PRINT
NEXT n
 
PRINT "F(2,1,1) ="; F(2, 1, 1)
PRINT "F(3,1,1) ="; F(3, 1, 1)
PRINT "F(2,2,1) ="; F(2, 2, 1)
 
END FUNCTION
 
FUNCTION F (n, x, y)
IF n = 0 THEN
RETURN x + y
ELSE
IF y = 0 THEN
RETURN x
ELSE
RETURN F (n - 1, F(n, x, y - 1), F(n, x, y - 1) + y)
ENDIF
ENDIF
 
END FUNCTION
END PROGRAM</syntaxhighlight>
{{out}}
<pre>Same as FreeBASIC entry.</pre>
 
==={{header|Yabasic}}===
{{trans|FreeBASIC}}
<langsyntaxhighlight lang="freebasic">for n = 0 to 1
print "Values of F(", n, ", x, y):"
print "y/x 0 1 2 3 4 5"
Line 264 ⟶ 520:
if y = 0 return x
return F(n - 1, F(n, x, y - 1), F(n, x, y - 1) + y)
end sub</langsyntaxhighlight>
{{out}}
<pre>Same as FreeBASIC entry.</pre>
 
=={{header|BCPL}}==
<syntaxhighlight lang="bcpl">get "libhdr"
 
let sudan(n, x, y) =
n = 0 -> x + y,
y = 0 -> x,
sudan(n-1, sudan(n, x, y-1), sudan(n, x, y-1)+y)
 
let showtable(f, n, x, y) be
$( writef("sudan(%N,x,y)*N", n)
writes(" ")
for i=0 to x do writed(i, 5)
for i=0 to y
$( writef("*N%I4:", i)
for j=0 to x do writed(f(n, j, i), 5)
$)
writes("*N*N")
$)
 
let show(f, n, x, y) be
writef("sudan(%I4,%I4,%I4) = %I6*N", n, x, y, f(n, x, y))
 
let start() be
$( showtable(sudan, 0, 6, 5)
showtable(sudan, 1, 6, 5)
wrch('*N')
show(sudan, 1, 3, 3)
show(sudan, 2, 1, 1)
show(sudan, 2, 2, 1)
show(sudan, 3, 1, 1)
$)</syntaxhighlight>
{{out}}
<pre>sudan(0,x,y)
0 1 2 3 4 5 6
0: 0 1 2 3 4 5 6
1: 1 2 3 4 5 6 7
2: 2 3 4 5 6 7 8
3: 3 4 5 6 7 8 9
4: 4 5 6 7 8 9 10
5: 5 6 7 8 9 10 11
 
sudan(1,x,y)
0 1 2 3 4 5 6
0: 0 1 2 3 4 5 6
1: 1 3 5 7 9 11 13
2: 4 8 12 16 20 24 28
3: 11 19 27 35 43 51 59
4: 26 42 58 74 90 106 122
5: 57 89 121 153 185 217 249
 
 
sudan( 1, 3, 3) = 35
sudan( 2, 1, 1) = 8
sudan( 2, 2, 1) = 27
sudan( 3, 1, 1) = 10228</pre>
 
=={{header|BQN}}==
<syntaxhighlight lang="bqn">_sudan←{
x 0 _𝕣 y: x + y;
x n _𝕣 0: x;
x n _𝕣 y: k (n-1)_𝕣 y+k←x𝕊y-1
}
 
•Show "⍉(↕7) 0 _sudan⌜ ↕6:"
•Show ⍉(↕7) 0 _sudan⌜ ↕6
 
•Show "⍉(↕7) 1 _sudan⌜ ↕6:"
•Show ⍉(↕7) 1 _sudan⌜ ↕6
 
•Show "1 2 _sudan 1: "∾•Fmt 1 2 _sudan 1
•Show "2 2 _sudan 1: "∾•Fmt 2 2 _sudan 1
•Show "1 3 _sudan 1: "∾•Fmt 1 3 _sudan 1</syntaxhighlight>
{{out}}
<pre>"⍉(↕7) 0 _sudan⌜ ↕6:"
┌─
╵ 0 1 2 3 4 5 6
1 2 3 4 5 6 7
2 3 4 5 6 7 8
3 4 5 6 7 8 9
4 5 6 7 8 9 10
5 6 7 8 9 10 11
"⍉(↕7) 1 _sudan⌜ ↕6:"
┌─
╵ 0 1 2 3 4 5 6
1 3 5 7 9 11 13
4 8 12 16 20 24 28
11 19 27 35 43 51 59
26 42 58 74 90 106 122
57 89 121 153 185 217 249
"1 2 _sudan 1: 8"
"2 2 _sudan 1: 27"
"1 3 _sudan 1: 10228"</pre>
=={{header|C}}==
{{trans|Javascript}}
<syntaxhighlight lang="c">
<lang C>
//Aamrun, 11th July 2022
 
Line 291 ⟶ 641:
return 0;
}
</syntaxhighlight>
</lang>
 
Output
Line 300 ⟶ 650:
=={{header|C++}}==
{{trans|C}}
<langsyntaxhighlight lang="cpp">
//Aamrun , 11th July, 2022
 
Line 322 ⟶ 672:
return 0;
}
</syntaxhighlight>
</lang>
Output
<pre>
Line 329 ⟶ 679:
=={{header|C Sharp|C#}}==
{{trans|C}}
<langsyntaxhighlight lang="csharp">
//Aamrun, 11th July 2022
 
Line 356 ⟶ 706:
}
}
</syntaxhighlight>
</lang>
Output
<pre>
F(1,3,3) = 35
</pre>
 
=={{header|CLU}}==
<syntaxhighlight lang="clu">sudan = proc (n, x, y: int) returns (int)
if n=0 then
return(x + y)
elseif y=0 then
return(x)
else
k: int := sudan(n, x, y-1)
return(sudan(n-1, k, k+y))
end
end sudan
 
table = proc (n, xs, ys: int) returns (string)
ss: stream := stream$create_output()
stream$putl(ss, "sudan(" || int$unparse(n) || ",x,y):")
stream$puts(ss, " ")
for x: int in int$from_to(0, xs)
do stream$putright(ss, int$unparse(x), 5) end
for y: int in int$from_to(0, ys) do
stream$putl(ss, "")
stream$putright(ss, int$unparse(y) || ":", 5)
for x: int in int$from_to(0, xs)
do stream$putright(ss, int$unparse(sudan(n, x, y)), 5) end
end
stream$putl(ss, "")
return(stream$get_contents(ss))
end table
 
show = proc (n, x, y: int) returns (string)
return("sudan(" || int$unparse(n)
|| ", " || int$unparse(x)
|| ", " || int$unparse(y)
|| ") = " || int$unparse(sudan(n,x,y)))
end show
 
start_up = proc ()
po: stream := stream$primary_output()
stream$putl(po, table(0, 6, 5))
stream$putl(po, table(1, 6, 5))
stream$putl(po, show(1, 3, 3))
stream$putl(po, show(2, 1, 1))
stream$putl(po, show(2, 2, 1))
stream$putl(po, show(3, 1, 1))
end start_up</syntaxhighlight>
{{out}}
<pre>sudan(0,x,y):
0 1 2 3 4 5 6
0: 0 1 2 3 4 5 6
1: 1 2 3 4 5 6 7
2: 2 3 4 5 6 7 8
3: 3 4 5 6 7 8 9
4: 4 5 6 7 8 9 10
5: 5 6 7 8 9 10 11
 
sudan(1,x,y):
0 1 2 3 4 5 6
0: 0 1 2 3 4 5 6
1: 1 3 5 7 9 11 13
2: 4 8 12 16 20 24 28
3: 11 19 27 35 43 51 59
4: 26 42 58 74 90 106 122
5: 57 89 121 153 185 217 249
 
sudan(1, 3, 3) = 35
sudan(2, 1, 1) = 8
sudan(2, 2, 1) = 27
sudan(3, 1, 1) = 10228</pre>
 
=={{header|Dart}}==
{{trans|C++}}
<syntaxhighlight lang="dart">int F(int n, int x, int y) {
if (n == 0) {
return x + y;
} else if (y == 0) {
return x;
}
 
return F(n - 1, F(n, x, y - 1), F(n, x, y - 1) + y);
}
 
void main() {
print('F(1,3,3) = ${F(1, 3, 3)}');
}</syntaxhighlight>
{{out}}
<pre>Same as C++ entry.</pre>
 
=={{header|Delphi}}==
{{works with|Delphi|6.0}}
{{libheader|SysUtils,StdCtrls}}
 
 
<syntaxhighlight lang="Delphi">
 
 
function SudanFunction(N,X,Y: integer): integer;
begin
if n = 0 then Result:=X + Y
else if y = 0 then Result:=X
else Result:=SudanFunction(N - 1, SudanFunction(N, X, Y - 1), SudanFunction(N, X, Y - 1) + Y);
end;
 
 
procedure ShowSudanFunction(Memo: TMemo; N,X,Y: integer);
begin
Memo.Lines.Add(Format('Sudan(%d,%d,%d)=%d',[n,x,y,SudanFunction(N,X,Y)]));
end;
 
 
procedure ShowSudanFunctions(Memo: TMemo);
var N,X,Y: integer;
var S: string;
begin
for N:=0 to 1 do
begin
Memo.Lines.Add(Format('Sudan(%d,X,Y)',[N]));
Memo.Lines.Add('Y/X 0 1 2 3 4 5');
Memo.Lines.Add('----------------------------');
for Y:=0 to 6 do
begin
S:=Format('%2d | ',[Y]);
for X:=0 to 5 do
begin
S:=S+Format('%3d ',[SudanFunction(N,X,Y)]);
end;
Memo.Lines.Add(S);
end;
Memo.Lines.Add('');
end;
 
ShowSudanFunction(Memo, 1, 3, 3);
ShowSudanFunction(Memo, 2, 1, 1);
ShowSudanFunction(Memo, 2, 2, 1);
ShowSudanFunction(Memo, 3, 1, 1);
end;
 
 
 
 
</syntaxhighlight>
{{out}}
<pre>
Sudan(0,X,Y)
Y/X 0 1 2 3 4 5
----------------------------
0 | 0 1 2 3 4 5
1 | 1 2 3 4 5 6
2 | 2 3 4 5 6 7
3 | 3 4 5 6 7 8
4 | 4 5 6 7 8 9
5 | 5 6 7 8 9 10
6 | 6 7 8 9 10 11
 
Sudan(1,X,Y)
Y/X 0 1 2 3 4 5
----------------------------
0 | 0 1 2 3 4 5
1 | 1 3 5 7 9 11
2 | 4 8 12 16 20 24
3 | 11 19 27 35 43 51
4 | 26 42 58 74 90 106
5 | 57 89 121 153 185 217
6 | 120 184 248 312 376 440
 
Sudan(1,3,3)=35
Sudan(2,1,1)=8
Sudan(2,2,1)=27
Sudan(3,1,1)=10228
 
Elapsed Time: 47.644 ms.
 
</pre>
 
 
=={{header|Draco}}==
<syntaxhighlight lang="draco">proc sudan(word n, x, y) word:
word k;
if n=0 then
x + y
elif y=0 then
x
else
k := sudan(n, x, y-1);
sudan(n-1, k, k+y)
fi
corp
 
proc table(word n, xs, ys) void:
word x, y;
writeln("sudan(",n,",x,y):");
write(" ");
for x from 0 upto xs do write(x:5) od;
for y from 0 upto ys do
writeln();
write(y:4, ":");
for x from 0 upto xs do write(sudan(n,x,y):5) od;
od;
writeln();
writeln()
corp
 
proc show(word n, x, y) void:
writeln("sudan(", n:1, ",", x:3, ",", y:3, ") = ", sudan(n,x,y):5)
corp
 
proc main() void:
table(0, 6, 5);
table(1, 6, 5);
show(1, 3, 3);
show(2, 1, 1);
show(2, 2, 1);
show(3, 1, 1)
corp</syntaxhighlight>
{{out}}
<pre>sudan(0,x,y):
0 1 2 3 4 5 6
0: 0 1 2 3 4 5 6
1: 1 2 3 4 5 6 7
2: 2 3 4 5 6 7 8
3: 3 4 5 6 7 8 9
4: 4 5 6 7 8 9 10
5: 5 6 7 8 9 10 11
 
sudan(1,x,y):
0 1 2 3 4 5 6
0: 0 1 2 3 4 5 6
1: 1 3 5 7 9 11 13
2: 4 8 12 16 20 24 28
3: 11 19 27 35 43 51 59
4: 26 42 58 74 90 106 122
5: 57 89 121 153 185 217 249
 
sudan(1, 3, 3) = 35
sudan(2, 1, 1) = 8
sudan(2, 2, 1) = 27
sudan(3, 1, 1) = 10228</pre>
 
=={{header|EasyLang}}==
{{trans|C}}
<syntaxhighlight>
func f n x y .
if n = 0
return x + y
.
if y = 0
return x
.
return f (n - 1) f n x (y - 1) (f n x (y - 1) + y)
.
print "F(1,3,3) = " & f 1 3 3
</syntaxhighlight>
 
{{out}}
<pre>
F(1,3,3) = 35
</pre>
 
=={{header|F_Sharp|F#}}==
{{trans|OCaml}}
<syntaxhighlight lang="fsharp">
let rec sudan = function
0L, x, y -> x + y
|_, x, 0L -> x
|n, x, y -> let x' = sudan (n, x, y-1L) in sudan (n-1L, x', x' + y)
printfn "%d\n%d\n%d" (sudan(1L, 13L, 14L)) (sudan(2L, 5L, 1L)) (sudan(2L, 2L, 2L))
</syntaxhighlight>
{{out}}
<pre>
245744
440
15569256417
</pre>
 
=={{header|Factor}}==
{{works with|Factor|0.99 2022-04-03}}
<langsyntaxhighlight lang="factor">USING: combinators kernel math prettyprint ;
 
: sudan ( n x y -- z )
Line 377 ⟶ 999:
} cond ;
 
3 1 1 sudan .</langsyntaxhighlight>
{{out}}
<pre>
Line 384 ⟶ 1,006:
 
Or with locals:
<syntaxhighlight lang="factor">USING: combinators kernel locals math prettyprint ;
=={{header|Factor}}==
{{works with|Factor|0.99 2022-04-03}}
<lang factor>USING: combinators kernel locals math prettyprint ;
 
:: sudan ( n x y -- z )
Line 393 ⟶ 1,013:
{ [ y zero? ] [ x ] }
[ n 1 - n x y 1 - sudan dup y + sudan ]
} cond ;</syntaxhighlight>
 
3 1 1 sudan .</lang>
{{out}}
<pre>
10228
</pre>
 
=={{header|FreeBASIC}}==
{{trans|Wren and Phyton}}
<langsyntaxhighlight lang="freebasic">Function F(n As Integer, x As Integer, y As Integer) As Integer
If n = 0 Then Return x + y
If y = 0 Then Return x
Line 427 ⟶ 1,041:
Print "F(3,1,1) ="; F(3,1,1)
Print "F(2,2,1) ="; F(2,2,1)
Sleep</langsyntaxhighlight>
{{out}}
<pre>Same as Wren entry.</pre>
Line 433 ⟶ 1,047:
=={{header|Go}}==
{{trans|Wren}}
<langsyntaxhighlight lang="go">package main
 
import "fmt"
Line 464 ⟶ 1,078:
fmt.Printf("F(3, 1, 1) = %d\n", F(3, 1, 1))
fmt.Printf("F(2, 2, 1) = %d\n", F(2, 2, 1))
}</langsyntaxhighlight>
 
{{out}}
Line 472 ⟶ 1,086:
 
=={{header|Haskell}}==
<langsyntaxhighlight lang="haskell">import Control.Monad.Memo (Memo, memo, startEvalMemo)
import Data.List.Split (chunksOf)
import System.Environment (getArgs)
Line 508 ⟶ 1,122:
[read xlo .. read xhi]
[read ylo .. read yhi]
_ -> error "Usage: sudan n xmin xmax ymin ymax"</langsyntaxhighlight>
{{out}}
<pre>
Line 542 ⟶ 1,156:
 
=={{header|Hoon}}==
<syntaxhighlight lang="hoon">
<lang Hoon>
|= [n=@ x=@ y=@]
^- @
Line 551 ⟶ 1,165:
x
$(n (dec n), x $(n n, x x, y (dec y)), y (add $(n n, x x, y (dec y)) y))
</syntaxhighlight>
</lang>
 
=={{header|J}}==
{{trans|Javascript}}
This is, of course, not particularly efficient and some results are too large for a computer to represent.
<langsyntaxhighlight Jlang="j">F=: {{ 'N X Y'=. y assert. N>:0
if. 0=N do. X+Y
elseif. Y=0 do. X
else. F (N-1),(F N,X,Y-1), Y+F N, X, Y-1
end.
}}"1</langsyntaxhighlight>
 
Examples: <langsyntaxhighlight Jlang="j"> F 0 0 0
0
F 1 1 1
Line 572 ⟶ 1,186:
10228
F 2 2 1
27</langsyntaxhighlight>
 
=={{header|Java}}==
{{trans|C}}
<syntaxhighlight lang="java">
<lang Java>
//Aamrun, 11th July 2022
 
Line 597 ⟶ 1,211:
}
}
</syntaxhighlight>
</lang>
Output
<pre>
Line 604 ⟶ 1,218:
 
=={{header|Javascript}}==
<syntaxhighlight lang="javascript">
<lang Javascript>
/**
* @param {bigint} n
Line 622 ⟶ 1,236:
return F(n - 1, F(n, x, y - 1), F(n, x, y - 1) + y);
}
</syntaxhighlight>
</lang>
 
=={{header|jq}}==
<syntaxhighlight lang=jq>
def sudan(n;x;y):
if n == 0 then x+y
elif y == 0 then x
else sudan(n-1; sudan(n;x;y-1); sudan(n;x;y-1) + y)
end;
 
# For testing and syntactic convenience:
def sudan:
"sudan(\(.[0]); \(.[1]); \(.[2])) => \(sudan(.[0]; .[1]; .[2]))";
 
# Illustrations
[0,0,0], [1,1,1], [2,1,1], [3,1,1], [2,2,1]
| sudan
</syntaxhighlight>
{{Output}}
<pre>
sudan(0; 0; 0) => 0
sudan(1; 1; 1) => 3
sudan(2; 1; 1) => 8
sudan(3; 1; 1) => 10228
sudan(2; 2; 1) => 27
</pre>
=={{header|Julia}}==
<langsyntaxhighlight rubylang="julia">using Memoize
 
@memoize function sudan(n, x, y)
Line 633 ⟶ 1,271:
foreach(t -> println("sudan($(t[1]), $(t[2]), $(t[3])) = ",
sudan(t[1], t[2], t[3])), ((0,0,0), (1,1,1), (2,1,1), (3,1,1), (2,2,1)))
</langsyntaxhighlight>{{out}}
<pre>
sudan(0, 0, 0) = 0
Line 641 ⟶ 1,279:
sudan(2, 2, 1) = 27
</pre>
 
=={{header|Lua}}==
<syntaxhighlight lang="lua">function F (n, x, y)
if n == 0 then
return x + y
elseif y == 0 then
return x
else
return F(n - 1, F(n, x, y - 1), F(n, x, y - 1) + y)
end
end
 
local testCases = {
{0, 0, 0},
{1, 1, 1},
{1, 3, 3},
{2, 1, 1},
{2, 2, 1},
{3, 1, 1}
}
 
for _, v in pairs(testCases) do
io.write("F(" .. table.concat(v, ",") .. ") = ")
print(F(unpack(v)))
end</syntaxhighlight>
{{out}}
<pre>F(0,0,0) = 0
F(1,1,1) = 3
F(1,3,3) = 35
F(2,1,1) = 8
F(2,2,1) = 27
F(3,1,1) = 10228</pre>
 
=={{header|MAD}}==
<syntaxhighlight lang="mad"> NORMAL MODE IS INTEGER
R WE HAVE TO DEFINE OUR OWN STACK FIRST
DIMENSION STACK(1000)
SET LIST TO STACK
 
R SUDAN FUNCTION
INTERNAL FUNCTION(N,X,Y)
ENTRY TO SUDAN.
 
R BASE CASES
WHENEVER N.E.0, FUNCTION RETURN X+Y
WHENEVER Y.E.0, FUNCTION RETURN X
 
R RECURSIVE CASE - WITH MANUAL STACK MANIPULATION
R NOTE WE DON'T NEED X AFTER THE FIRST CALL
SAVE RETURN
SAVE DATA N,Y
K = SUDAN.(N,X,Y-1)
RESTORE DATA N,Y
RESTORE RETURN
 
SAVE RETURN
K = SUDAN.(N-1, K, K+Y)
RESTORE RETURN
FUNCTION RETURN K
END OF FUNCTION
INTERNAL FUNCTION(N,X,Y)
ENTRY TO SHOW.
VECTOR VALUES FMT = $7HSUDAN.(,I1,1H,,I1,1H,,I1,4H) = ,I8*$
PRINT FORMAT FMT,N,X,Y,SUDAN.(N,X,Y)
END OF FUNCTION
 
SHOW.(1,3,3)
SHOW.(2,1,1)
SHOW.(2,2,1)
SHOW.(3,1,1)
END OF PROGRAM</syntaxhighlight>
{{out}}
<pre>SUDAN.(1,3,3) = 35
SUDAN.(2,1,1) = 8
SUDAN.(2,2,1) = 27
SUDAN.(3,1,1) = 10228</pre>
 
=={{header|Modula-2}}==
<syntaxhighlight lang="modula2">MODULE Sudan;
FROM InOut IMPORT WriteCard, WriteString, WriteLn;
 
PROCEDURE sudan(n, x, y: CARDINAL): CARDINAL;
VAR k: CARDINAL;
BEGIN
IF n = 0 THEN RETURN x+y
ELSIF y = 0 THEN RETURN x
ELSE
k := sudan(n, x, y-1);
RETURN sudan(n-1, k, k+y)
END
END sudan;
 
PROCEDURE Show(n, x, y: CARDINAL);
BEGIN
WriteString("sudan(");
WriteCard(n, 0);
WriteString(", ");
WriteCard(x, 0);
WriteString(", ");
WriteCard(y, 0);
WriteString(") = ");
WriteCard(sudan(n,x,y), 0);
WriteLn
END Show;
 
BEGIN
Show(0, 0, 0);
Show(1, 1, 1);
Show(2, 1, 1);
Show(3, 1, 1);
Show(2, 2, 1)
END Sudan.</syntaxhighlight>
{{out}}
<pre>sudan(0, 0, 0) = 0
sudan(1, 1, 1) = 3
sudan(2, 1, 1) = 8
sudan(3, 1, 1) = 10228
sudan(2, 2, 1) = 27</pre>
 
=={{header|Nim}}==
<syntaxhighlight lang="Nim">import std/[unicode, strformat]
 
func sudan(n, x, y: Natural): int =
if n == 0: return x + y
if y == 0: return x
let z = sudan(n, x, y - 1)
return sudan(n - 1, z, z + y)
 
const Delta = ord("₀".toRunes()[0]) - ord('0')
 
func subscript(n: Natural): string =
for c in $n:
result.add Rune(ord(c) + Delta)
 
for (n, x, y) in [(0, 0, 0), (1, 1, 1), (2, 1, 1), (2, 2, 1), (2, 2, 2), (3, 1, 1)]:
echo &"F{subscript(n)}({x}, {y}) = {sudan(n, x, y)}"
</syntaxhighlight>
 
{{out}}
<pre>F₀(0, 0) = 0
F₁(1, 1) = 3
F₂(1, 1) = 8
F₂(2, 1) = 27
F₂(2, 2) = 15569256417
F₃(1, 1) = 10228
</pre>
 
=={{header|OCaml}}==
<syntaxhighlight lang="ocaml">let rec sudan = function
| 0, x, y -> x + y
| _, x, 0 -> x
| n, x, y -> let x' = sudan (n, x, pred y) in sudan (pred n, x', x' + y)</syntaxhighlight>
<pre>
# sudan (1, 13, 14) ;;
- : int = 245744
# sudan (2, 5, 1) ;;
- : int = 440
# sudan (2, 2, 2) ;;
- : int = 15569256417
</pre>
=={{header|REXX}}==
<syntaxhighlight lang="rexx">
/* REXX implement the SUDAN function */
Say '+---++-------------------------+'
Say '| y ||x= 0 1 2 3 4 5 |'
Say '+===++=========================+'
Do y=0 To 6
s='|' y '||'
Do x=0 To 5
s=s format(sudan(x,y),3)
End
Say s '|'
End
Say '+===++=========================+'
Exit
 
sudan: Procedure
Parse Arg x,y
Return sudan1(1,x,y)
 
sudan1: Procedure
Parse Arg n,x,y
Select
When n=0 Then Return x+y
When y=0 Then Return x
Otherwise Return sudan1(n-1,sudan1(n,x,y-1),sudan1(n,x,y-1)+y)
End</syntaxhighlight>
{{out|output}}
<pre>+---++-------------------------+
| y ||x= 0 1 2 3 4 5 |
+===++=========================+
| 0 || 0 1 2 3 4 5 |
| 1 || 1 3 5 7 9 11 |
| 2 || 4 8 12 16 20 24 |
| 3 || 11 19 27 35 43 51 |
| 4 || 26 42 58 74 90 106 |
| 5 || 57 89 121 153 185 217 |
| 6 || 120 184 248 312 376 440 |
+===++=========================+</pre>
 
=={{header|Pascal}}==
==={{header|Free Pascal}}===
{{trans|Delphi}}
<syntaxhighlight lang="pascal">
program Sudan;
//trans https://rosettacode.org/wiki/Sudan_function#Delphi
{$IFDEF FPC} {$MODE DELPHI} {$OPTIMIZATION ON,ALL}{$ENDIF}
{$IFDEF WINDOWS}{$APPTYPE CONSOLE}{$ENDIF}
uses
sysutils;
function SudanFunction(N,X,Y: UInt64): UInt64;
begin
if n = 0 then
Result:=X + Y
else
if y = 0 then
Result:=X
else
Result:=SudanFunction(N - 1, SudanFunction(N, X, Y - 1), SudanFunction(N, X, Y - 1) + Y);
end;
 
procedure ShowSudanFunction(N,X,Y: UInt64);
begin
writeln(Format('Sudan(%d,%d,%d)=%d',[n,x,y,SudanFunction(N,X,Y)]));
end;
 
procedure ShowSudanFunctions;
var
N,X,Y: UInt64;
S: string;
begin
for N:=0 to 1 do
begin
writeln(Format('Sudan(%d,X,Y)',[N]));
writeln('Y/X 0 1 2 3 4 5');
writeln('----------------------------');
for Y:=0 to 6 do
begin
S:=Format('%2d | ',[Y]);
for X:=0 to 5 do
begin
S:=S+Format('%3d ',[SudanFunction(N,X,Y)]);
end;
writeln(S);
end;
writeln('');
end;
end;
 
BEGIN
ShowSudanFunctions;
ShowSudanFunction( 1, 3, 3);
ShowSudanFunction( 2, 1, 1);
ShowSudanFunction( 2, 2, 1);
ShowSudanFunction( 2, 1, 2);
ShowSudanFunction( 3, 1, 1);
ShowSudanFunction( 2, 2, 2);
END.</syntaxhighlight>
{{out|@TIO.RUN}}<pre>
Sudan(0,X,Y)
Y/X 0 1 2 3 4 5
----------------------------
0 | 0 1 2 3 4 5
1 | 1 2 3 4 5 6
2 | 2 3 4 5 6 7
3 | 3 4 5 6 7 8
4 | 4 5 6 7 8 9
5 | 5 6 7 8 9 10
6 | 6 7 8 9 10 11
 
Sudan(1,X,Y)
Y/X 0 1 2 3 4 5
----------------------------
0 | 0 1 2 3 4 5
1 | 1 3 5 7 9 11
2 | 4 8 12 16 20 24
3 | 11 19 27 35 43 51
4 | 26 42 58 74 90 106
5 | 57 89 121 153 185 217
6 | 120 184 248 312 376 440
 
Sudan(1,3,3)=35
Sudan(2,1,1)=8
Sudan(2,2,1)=27
Sudan(2,1,2)=10228
Sudan(3,1,1)=10228
Sudan(2,2,2)=15569256417
 
Real time: 3.822 s CPU share: 98.74 %</pre>
 
=={{header|Perl}}==
Three ways of doing the same thing.
<langsyntaxhighlight lang="perl">use v5.36;
use experimental 'for_list';
 
Line 659 ⟶ 1,588:
for my($n,$x,$y) (0,0,0, 1,1,1, 2,1,1, 3,1,1, 2,2,1) {
say join ' ',F1($n,$x,$y), F2($n,$x,$y), F3($n,$x,$y)
}</langsyntaxhighlight>
{{out}}
<pre>0 0 0
Line 668 ⟶ 1,597:
 
=={{header|Phix}}==
<!--<langsyntaxhighlight Phixlang="phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">F</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">y</span><span style="color: #0000FF;">)</span>
Line 692 ⟶ 1,621:
<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;">"F(%d, %d, %d) = %d\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">x</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span><span style="color: #0000FF;">,</span><span style="color: #000000;">F</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">x</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span><span style="color: #0000FF;">)})</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<!--</langsyntaxhighlight>-->
Output same as Wren.
 
=={{header|PHP}}==
{{trans|C}}
<langsyntaxhighlight lang="php">
#Aamrun , 11th July 2022
 
Line 714 ⟶ 1,643:
echo "F(1,3,3) = " . F(1,3,3);
?>
</syntaxhighlight>
</lang>
Output
<pre>
Line 722 ⟶ 1,651:
=={{header|Python}}==
{{trans|Javascript}}
<syntaxhighlight lang="python">
<lang Python>
# Aamrun, 11th July 2022
 
Line 735 ⟶ 1,664:
print("F(1,3,3) = ", F(1,3,3))
</syntaxhighlight>
</lang>
 
Output
<pre>
F(1,3,3) = 35
</pre>
 
=={{header|Quackery}}==
 
<syntaxhighlight lang="Quackery"> [ rot dup 0 = iff
[ drop + ] done
over 0 = iff
2drop done
over temp put
dup 1 -
swap 2swap 1 -
recurse
dup temp take +
again ] is sudan ( n x y --> f(n) )
' [ [ 0 0 0 ]
[ 1 1 1 ]
[ 1 3 3 ]
[ 2 1 1 ]
[ 2 2 1 ]
[ 3 1 1 ] ]
witheach
[ dup echo say " = "
do sudan echo cr ]</syntaxhighlight>
 
{{out}}
 
<pre>[ 0 0 0 ] = 0
[ 1 1 1 ] = 3
[ 1 3 3 ] = 35
[ 2 1 1 ] = 8
[ 2 2 1 ] = 27
[ 3 1 1 ] = 10228
</pre>
 
=={{header|R}}==
{{trans|C}}
<langsyntaxhighlight lang="rsplus">
#Aamrun, 11th July 2022
 
Line 763 ⟶ 1,725:
 
print(paste("F(1,3,3) = " , F(1,3,3)))
</syntaxhighlight>
</lang>
Output
<pre>
Line 771 ⟶ 1,733:
=={{header|Raku}}==
Outputting wiki-tables to more closely emulate the wikipedia examples. Not very efficient but good enough.
<syntaxhighlight lang="raku" perl6line>multi F (0, $x, $y) { $x + $y }
multi F ($n where * > 0, $x, 0) { $x }
multi F ($n, $x, $y) { F($n-1, F($n, $x, $y-1), F($n, $x, $y-1) + $y) }
Line 782 ⟶ 1,744:
say( "|}" );
}
</syntaxhighlight>
</lang>
{{out}}
{|class="wikitable"
Line 834 ⟶ 1,796:
|14||14||29||60||123||250||505||1016||2039||4086||8181||16372||32755||65522||131057||262128
|}
 
=={{header|RPL}}==
{{works with|RPL|HP|48-R}}
« '''IF''' DUP2 2 GET AND '''THEN'''
DUP 2 GET 3 PICK ROT { 0 1 } - <span style="color:blue">SUDAN</span>
SWAP OVER + 2 →LIST SWAP 1 - SWAP <span style="color:blue">SUDAN</span>
'''ELSE''' ∑LIST SWAP DROP '''END'''
» '<span style="color:blue">SUDAN</span>' STO <span style="color:grey">''@ ( n { x y } ) → F<sub>n</sub>(x,y) )''</span>
 
{ { 0 { 0 0 } } { 1 { 1 1 } } { 1 { 3 3 } } { 2 { 1 1 } } { 2 { 2 1 } } { 3 { 1 1 } } } 1 « EVAL <span style="color:blue">SUDAN</span> » DOLIST
 
{{out}}
<pre>
1: { 0 3 35 8 27 10228 }
</pre>
 
=={{header|Ruby}}==
<langsyntaxhighlight lang="ruby">
def sudan(n, x, y)
return x + y if n == 0
Line 843 ⟶ 1,820:
sudan(n - 1, sudan(n, x, y - 1), sudan(n, x, y - 1) + y)
end
</syntaxhighlight>
</lang>
 
Output
Line 851 ⟶ 1,828:
</pre>
 
=={{header|VlangSwift}}==
{{trans|C}}
I have started working on Swift and am going to practice on RosettaCode. On converting my C implementation for this task to Swift which I contributed last year, I found Swift allows statement ending semicolons and enclosing parantheses in if/else statements which are mandatory in C. I didn't find that anywhere while learning Swift so I am posting both implementations here, the "C like" and the "Pure" Swift.
 
Both have been tested with Xcode 14.2 (14C18)
 
===C like===
<syntaxhighlight lang="swift">
//Aamrun, 3rd February 2023
 
func F(n: Int,x: Int,y: Int) -> Int {
if (n == 0) {
return x + y;
}
 
else if (y == 0) {
return x;
}
 
return F(n: n - 1, x: F(n: n, x: x, y: y - 1), y: F(n: n, x: x, y: y - 1) + y);
}
 
print("F1(3,3) = " + String(F(n: 1,x: 3,y: 3)));
</syntaxhighlight>
 
===Pure Swift===
<syntaxhighlight lang="swift">
//Aamrun, 3rd February 2023
 
func F(n: Int,x: Int,y: Int) -> Int {
if n == 0 {
return x + y
}
 
else if y == 0 {
return x
}
 
return F(n: n - 1, x: F(n: n, x: x, y: y - 1), y: F(n: n, x: x, y: y - 1) + y)
}
 
print("F1(3,3) = " + String(F(n: 1,x: 3,y: 3)))
</syntaxhighlight>
 
Output is the same for both
 
{{out}}
<pre>
F1(3,3) = 35
</pre>
 
=={{header|V (Vlang)}}==
{{trans|Wren}}
<langsyntaxhighlight lang="ruby">fn sudan(n int, x int, y int) int {
if n == 0 {
return x + y
Line 881 ⟶ 1,909:
println("F(3, 1, 1) = ${sudan(3, 1, 1)}")
println("F(2, 2, 1) = ${sudan(2, 2, 1)}")
}</langsyntaxhighlight>
 
{{out}}
Line 890 ⟶ 1,918:
=={{header|Wren}}==
{{libheader|Wren-fmt}}
<langsyntaxhighlight ecmascriptlang="wren">import "./fmt" for Fmt
 
var F = Fn.new { |n, x, y|
Line 914 ⟶ 1,942:
System.print("F(2, 1, 1) = %(F.call(2, 1, 1))")
System.print("F(3, 1, 1) = %(F.call(3, 1, 1))")
System.print("F(2, 2, 1) = %(F.call(2, 2, 1))")</langsyntaxhighlight>
 
{{out}}
Line 947 ⟶ 1,975:
=={{header|XPL0}}==
{{trans|Wren}}
<langsyntaxhighlight XPL0lang="xpl0">func F; int N, X, Y;
[if N = 0 then return X + Y;
if Y = 0 then return X;
Line 970 ⟶ 1,998:
Text(0, "F(3, 1, 1) = "); IntOut(0, F(3, 1, 1)); CrLf(0);
Text(0, "F(2, 2, 1) = "); IntOut(0, F(2, 2, 1)); CrLf(0);
]</langsyntaxhighlight>
 
{{out}}
1,150

edits