Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何更改Julia中的最大递归深度?_Julia - Fatal编程技术网

如何更改Julia中的最大递归深度?

如何更改Julia中的最大递归深度?,julia,Julia,我很好奇(4,2)参数的Rosseta代码()算法有多快和准确。但是我有一个错误 julia>使用Memoize @记忆ack3(m,n)= m==0?n+1: n==0?ack3(m-1,1): ack3(m-1,ack3(m,n-1)) #警告!下一行必须计算并打印19729位数字! julia>ack3(4,2)#->StackOverflower错误 #必须->2003529930406846494790723515602575044782547559751419265016973108

我很好奇(4,2)参数的Rosseta代码()算法有多快和准确。但是我有一个错误

julia>使用Memoize
@记忆ack3(m,n)=
m==0?n+1:
n==0?ack3(m-1,1):
ack3(m-1,ack3(m,n-1))
#警告!下一行必须计算并打印19729位数字!
julia>ack3(4,2)#->StackOverflower错误
#必须->200352993040684649479072351560257504478254755975141926501697310894059556311
# ...
# 4717124577965048175856395072895337539755822087777506072339445587895905719156733
编辑: 奥斯卡·史密斯说得对,尝试ack3(4,2)是不现实的。这是从Rosseta的C++翻译过来的版本:

模块阿克曼
函数ackermann(m::UInt,n::UInt)
函数ack(m::UInt,n::BigInt)
如果m==0
返回n+1
elseif m==1
返回n+2
elseif m==2
返回3+2*n;
elseif m==3
返回5+8*(BigInt(2)^n-1)
其他的
如果n==0
返回应答(m-1,BigInt(1))
其他的
返回应答(m-1,应答(m,n-1))
结束
结束
结束
返回应答(m,BigInt(n))
结束
结束
朱莉娅>导入阿克曼;阿克曼(UInt(1),UInt(1))@时间(a4_2=Ackermann.Ackermann(UInt(4),UInt(2));t=“$a4_2”;println(“len=$(length(t))第一位数字=$(t[1:20])最后一位数字=$(t[end-20:end]))
0.000041秒(57次分配:33.344千磅)
len=19729第一位数字=20035299304064649最后一位数字=44558895905719156733

仅供参考,即使更改最大递归深度,也不会得到正确答案,因为Julia使用64位整数,因此使用make-stuff的整数溢出不起作用。为了得到正确的答案,您必须使用大整数来获得任何希望。下一个问题是,您可能不想记忆,因为几乎所有的计算都不会重复,而且您将计算超过10^19729个不同输入的函数,您确实不想存储这些输入。

仅供参考,即使更改最大递归深度,您也不会得到正确的答案,因为Julia使用64位整数,所以整数溢出使得东西不能工作。为了得到正确的答案,您必须使用大整数来获得任何希望。下一个问题是,您可能不想记忆,因为几乎所有的计算都不会重复,并且您将计算超过10^19729个不同输入的函数,您确实不想存储这些输入。

Julia本身对堆栈大小没有内部限制,但您的操作系统有。此处的确切限制(以及如何更改)将取决于系统。在我的Mac上(我假设是其他POSIX-y系统),我可以使用
ulimit
,检查并更改shell调用的程序的堆栈大小:

$ ulimit -s
8192

$ julia -q
julia> f(x) = x > 0 ? f(x-1) : 0 # a simpler recursive function
f (generic function with 1 method)

julia> f(523918)
0

julia> f(523919)
ERROR: StackOverflowError:
Stacktrace:
 [1] f(::Int64) at ./REPL[1]:1 (repeats 80000 times)

$ ulimit -s 16384

$ julia -q
julia> f(x) = x > 0 ? f(x-1) : 0
f (generic function with 1 method)

julia> f(1048206)
0

julia> f(1048207)
ERROR: StackOverflowError:
Stacktrace:
 [1] f(::Int64) at ./REPL[1]:1 (repeats 80000 times)
我相信,适合堆栈的递归调用的确切数量将取决于系统和函数本身的复杂性(即,每个递归调用需要在堆栈上存储多少)。这是最低限度。我不知道为了计算Ackermann函数,需要多大的堆栈限制

请注意,我将堆栈大小增加了一倍,递归调用的数量也增加了一倍多——这是因为开销恒定:

julia> log2(523918)
18.998981503278365

julia> 2^19 - 523918
370

julia> log2(1048206)
19.99949084151746

julia> 2^20 - 1048206
370

Julia本身对堆栈大小没有内部限制,但您的操作系统有。此处的确切限制(以及如何更改)将取决于系统。在我的Mac上(我假设是其他POSIX-y系统),我可以使用
ulimit
,检查并更改shell调用的程序的堆栈大小:

$ ulimit -s
8192

$ julia -q
julia> f(x) = x > 0 ? f(x-1) : 0 # a simpler recursive function
f (generic function with 1 method)

julia> f(523918)
0

julia> f(523919)
ERROR: StackOverflowError:
Stacktrace:
 [1] f(::Int64) at ./REPL[1]:1 (repeats 80000 times)

$ ulimit -s 16384

$ julia -q
julia> f(x) = x > 0 ? f(x-1) : 0
f (generic function with 1 method)

julia> f(1048206)
0

julia> f(1048207)
ERROR: StackOverflowError:
Stacktrace:
 [1] f(::Int64) at ./REPL[1]:1 (repeats 80000 times)
我相信,适合堆栈的递归调用的确切数量将取决于系统和函数本身的复杂性(即,每个递归调用需要在堆栈上存储多少)。这是最低限度。我不知道为了计算Ackermann函数,需要多大的堆栈限制

请注意,我将堆栈大小增加了一倍,递归调用的数量也增加了一倍多——这是因为开销恒定:

julia> log2(523918)
18.998981503278365

julia> 2^19 - 523918
370

julia> log2(1048206)
19.99949084151746

julia> 2^20 - 1048206
370

谢谢你的回答!虽然您认为更改maxdepth不会有帮助的假设似乎是正确的,但您的答案中至少有一个错误。没有回忆录的ack(4,1)有2个回忆录呼叫,回忆录的ack(4,1)只有163个呼叫。关于更改最大递归深度的可能性的问题仍然存在!:)谢谢你的回答!虽然您认为更改maxdepth不会有帮助的假设似乎是正确的,但您的答案中至少有一个错误。没有回忆录的ack(4,1)有2个回忆录呼叫,回忆录的ack(4,1)只有163个呼叫。关于更改最大递归深度的可能性的问题仍然存在!:)