“达到最大递归深度”错误来自这个简单的代码:
function [ y ] = A( X )
y = 0;
if(length(X) >=1)
for j=1:length(X)
y = y + A(j);
endfor
endif
end
A的大小未知。 X是一个向量。 计算数字之和。
不同的单元测试用于测试此功能。我错过了什么吗?
答案 0 :(得分:0)
看起来你递归地调用A并且j = 1,并且该函数不符合结束条件(长度(X)> = 1),因为长度永远不会改变。
如果您需要对此问题使用递归,则需要在重复递归调用之前从X中删除该元素。
希望这有帮助!
<强>更新强>
基于文档here和here,似乎需要对递归进行以下操作(对不起,但是我没有八度音,因为我可能不正确,请告知是否):
function [ y ] = A( X )
y = 0;
if(length(X) >=1)
y = X(end);
X(end) = [];
y = y + A(X);
endif
end
答案 1 :(得分:0)
您的原始功能是正确的。 (编辑后的版本(带循环)根本不起作用。)X行(结束)= [];每次调用使X缩短一次,确保递归终止。
function [ y ] = A( X )
y = 0;
if(length(X) >=1)
y = X(end);
X(end) = [];
y = y + A(X);
endif
end
问题是Octave提供了非常有限的递归深度(默认值为max_recursion_depth()== 256)。因此,使用默认设置,A(1:400)会生成您观察到的错误消息。人们可以略微增加它,例如max_recursion_depth(512)允许A(1:400)工作(如预期的那样),但A(1:500)导致Octave 4.2.1崩溃(至少在我的机器上),但这似乎是Octave中的一个bug而不是对语言的误解。