Recursion 最大递归深度_倍频程

Recursion 最大递归深度_倍频程,recursion,vector,octave,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是一个向量。 计算数字之和 不同的单元测试用于测试此功能。我遗漏了什么吗?看起来您是在用j=1递归调用A,函数不满足lengthX>=1的结束条件,因为长

“已达到最大递归深度”错误来自以下普通代码:

function [ y ] = A( X )
    y = 0;
    if(length(X) >=1)
        for j=1:length(X)
            y = y + A(j);
        endfor
    endif
end
A的大小未知。X是一个向量。 计算数字之和


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

看起来您是在用j=1递归调用A,函数不满足lengthX>=1的结束条件,因为长度从未更改

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

希望这有帮助

更新

根据文档和,似乎需要为递归执行以下操作抱歉,但我现在所在的位置没有八度,因此可能不正确,如果是,请告知:

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

您的原始函数是正确的。带循环的已编辑版本根本不起作用。直线Xend=[];为每个调用将X缩短一,确保递归终止

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

问题是倍频程提供了非常有限的递归深度默认值max\u recursion\u depth==256。因此,使用默认设置,A1:400生成您观察到的错误消息。可以稍微增加它,例如max_recursion_depth512允许A1:400按预期工作,但A1:500至少会导致倍频程4.2.1在我的机器上崩溃,但这似乎是倍频程中的一个错误,而不是对语言的误解。

对于j=1:lengthX,此语句意味着j将在每个循环中增加1,直到达到lengthX。所以Aj的值应该改变每个循环,对吗?我使用lengthX>=1作为iff向量的长度非零,即它包含一些数字。没有循环?你忘了循环我猜对不起,我以为这是一个关于递归的问题。看起来您是通过使用y=y+Aj创建递归的,因为A是它自己的函数名。因此,当您确实在循环时,系统会不断地创建对A的新调用,这会导致函数无限地调用自身——也许我所说的有点混乱。如果这是不需要的行为,那么也许你应该使用循环和'y=y+xj'来代替。我发现了。我只是用了倍频程的求和函数来求向量的和。此外,在我的代码中,我是返回变量,而求和变量y是相同的。如此无限递归。很高兴它为您解决了。我本来会考虑一种更标准的方法,但更担心的是你想学习递归过程。希望从这里开始一切都是下坡路!您可以使用max_recursion_depth更改最大递归深度,但当您遇到此错误时,您的代码可能存在错误。这是我唯一的代码。什么是错误?