Sudan function: Difference between revisions
(add JS implementation) |
(J) |
||
Line 32: | Line 32: | ||
$(n (dec n), x $(n n, x x, y (dec y)), y (add $(n n, x x, y (dec y)) y)) |
$(n (dec n), x $(n n, x x, y (dec y)), y (add $(n n, x x, y (dec y)) y)) |
||
</lang> |
</lang> |
||
=={{header|J}}== |
|||
{{trans|Javascript}} |
|||
This is, of course, not particularly efficient and some results are too large for a computer to represent. |
|||
<lang J>F=: {{ 'N X Y'=. y |
|||
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</lang> |
|||
Examples: <lang J> F 0 0 0 |
|||
0 |
|||
F 1 1 1 |
|||
3 |
|||
F 2 1 1 |
|||
8 |
|||
F 3 1 1 |
|||
10228 |
|||
F 2 2 1 |
|||
27</lang> |
|||
=={{header|Javascript}}== |
=={{header|Javascript}}== |
Revision as of 02:47, 11 July 2022
You are encouraged to solve this task according to the task description, using any language you may know.
The Sudan function is a classic example of a recursive function, notable especially because it is not a primitive recursive function. This is also true of the better-known Ackermann function. The Sudan function was the first function having this property to be published.
The Sudan function is usually defined as follows (svg):
<big> :<math>\begin{array}{lll} F_0 (x, y) & = x+y \\ F_{n+1} (x, 0) & = x & \text{if } n \ge 0 \\ F_{n+1} (x, y+1) & = F_n (F_{n+1} (x, y), F_{n+1} (x, y) + y + 1) & \text{if } n\ge 0 \\ \end{array} </math> </big>
- Task
Write a function which returns the value of F(x, y).
Hoon
<lang Hoon> |= [n=@ x=@ y=@] ^- @ |- ?: =(n 0)
(add x y)
?: =(y 0)
x
$(n (dec n), x $(n n, x x, y (dec y)), y (add $(n n, x x, y (dec y)) y)) </lang>
J
This is, of course, not particularly efficient and some results are too large for a computer to represent. <lang J>F=: {{ 'N X Y'=. y
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</lang>
Examples: <lang J> F 0 0 0 0
F 1 1 1
3
F 2 1 1
8
F 3 1 1
10228
F 2 2 1
27</lang>
JavaScript
<lang Javascript> /**
* @param {bigint} n * @param {bigint} x * @param {bigint} y * @returns {bigint} */
function F(n, x, y) {
if (n === 0n) { return x + y; }
if (y === 0n) { return x; }
return F(n - 1n, F(n, x, y - 1n), F(n, x, y - 1n) + y);
} </lang>