Sudan function: Difference between revisions
Content deleted Content added
Added Quackery. |
|||
(33 intermediate revisions by 17 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}
F_0 (x, y) & = x+y \\
F_{n+1} (x, 0) & = x & \text{if } n \ge 0 \\
Line 15 ⟶ 13:
\end{array}
</math>
;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}}==
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">
Line 202 ⟶ 309:
return F(n - 1, F(n, x, y - 1), F(n, x, y - 1) + y)
end function</syntaxhighlight>
{{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>
Line 238 ⟶ 381:
{{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}}===
Line 268 ⟶ 524:
<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}}
Line 360 ⟶ 710:
<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 lang=text>
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>
Line 656 ⟶ 1,278:
sudan(3, 1, 1) = 10228
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|PascalABC.NET}}==
<syntaxhighlight lang="delphi">
function F(n,x,y: integer): integer;
begin
if n = 0 then
Result := x + y
else if y = 0 then
Result := x
else Result := F(n - 1, F(n, x, y - 1), F(n, x, y - 1) + y);
end;
begin
F(1,3,3).Println;
end.
</syntaxhighlight>
{{out}}
<pre>
35
</pre>
Line 769 ⟶ 1,702:
recurse
dup temp take +
' [ [ 0 0 0 ]
Line 883 ⟶ 1,816:
|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}}==
Line 898 ⟶ 1,846:
puts sudan(1, 3, 3)
> 35
</pre>
=={{header|Swift}}==
{{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>
Line 939 ⟶ 1,938:
=={{header|Wren}}==
{{libheader|Wren-fmt}}
<syntaxhighlight lang="
var F = Fn.new { |n, x, y|
|