나는 (4,2) 매개 변수에 대해 Rosseta 코드 (https://rosettacode.org/wiki/Ackermann_function)에서 얼마나 빠르고 정확한 알고리즘인지 궁금했습니다. 하지만 StackOverflowError가 있습니다.Julia에서 최대 재귀 깊이를 변경하는 방법은 무엇입니까?
julia> using Memoize
@memoize ack3(m, n) =
m == 0 ? n + 1 :
n == 0 ? ack3(m-1, 1) :
ack3(m-1, ack3(m, n-1))
# WARNING! Next line has to calculate and print number with 19729 digits!
julia> ack3(4,2) # -> StackOverflowError
# has to be -> 2003529930406846464979072351560255750447825475569751419265016973710894059556311
# ...
# 4717124577965048175856395072895337539755822087777506072339445587895905719156733
편집 : 오스카 스미스는 ack3 (4,2)를 시도하는 것은 비현실적이다 권리입니다. 줄리아는 64 개 비트 정수 작동하지 메이크업 물건 너무 정수 오버 플로우를 사용하기 때문에
module Ackermann
function ackermann(m::UInt, n::UInt)
function ack(m::UInt, n::BigInt)
if m == 0
return n + 1
elseif m == 1
return n + 2
elseif m == 2
return 3 + 2 * n;
elseif m == 3
return 5 + 8 * (BigInt(2)^n - 1)
else
if n == 0
return ack(m - 1, BigInt(1))
else
return ack(m - 1, ack(m, n - 1))
end
end
end
return ack(m, BigInt(n))
end
end
julia> import Ackermann;Ackermann.ackermann(UInt(1),UInt(1));@time(a4_2 = Ackermann.ackermann(UInt(4),UInt(2)));t = "$a4_2"; println("len = $(length(t)) first_digits=$(t[1:20]) last digits=$(t[end-20:end])")
0.000041 seconds (57 allocations: 33.344 KiB)
len = 19729 first_digits=20035299304068464649 last digits=445587895905719156733
고마워요! :) BTW 우분투 내 번호가 조금 작습니다 ... – Liso