最大递归深度倍数

时间:2014-09-17 05:56:24

标签: recursion vector octave

“达到最大递归深度”错误来自这个简单的代码:

function [ y ] = A( X )
    y = 0;
    if(length(X) >=1)
        for j=1:length(X)
            y = y + A(j);
        endfor
    endif
end

A的大小未知。 X是一个向量。 计算数字之和。

不同的单元测试用于测试此功能。我错过了什么吗?

2 个答案:

答案 0 :(得分:0)

看起来你递归地调用A并且j = 1,并且该函数不符合结束条件(长度(X)> = 1),因为长度永远不会改变。

如果您需要对此问题使用递归,则需要在重复递归调用之前从X中删除该元素。

希望这有帮助!

<强>更新

基于文档herehere,似乎需要对递归进行以下操作(对不起,但是我没有八度音,因为我可能不正确,请告知是否):

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而不是对语言的误解。