“已达到的最大递归深度”错误来自以下简单代码:
function [ y ] = A( X )
y = 0;
if(length(X) >=1)
for j=1:length(X)
y = y + A(j);
endfor
endif
endA的大小未知。X是一个向量。计算数字的和。
使用不同的单元测试来测试此功能。我是不是遗漏了什么?
发布于 2014-09-17 14:08:24
看起来您正在使用j=1递归调用A,并且函数不满足结束条件(即长度(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发布于 2017-06-10 07:07:53
您的原始函数是正确的。(编辑后的版本(带有循环)根本不起作用。)行X(end)=[];使每个调用的X缩短1,确保递归终止。
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中的一个错误,而不是对语言的误解。
https://stackoverflow.com/questions/25883247
复制相似问题