【问题标题】:Maximum recursion limit of 500 reached达到最大递归限制 500
【发布时间】:2011-12-17 22:35:01
【问题描述】:

我在尝试运行时收到以下消息 (adpcm_encoder)。

??? Maximum recursion limit of 500 reached. Use set(0,'RecursionLimit',N)
to change the limit. Be aware that exceeding your available stack space can
crash MATLAB and/or your computer.

Error in ==> fileparts

我在很多网站上搜索过这个问题,但没有找到具体的解决方案。

代码是:

function adpcm_y = adpcm_encoder(raw_y)



Y = wavread('two.wav');
Y_en = adpcm_encoder(Y);


IndexTable = [-1, -1, -1, -1, 2, 4, 6, 8, -1, -1, -1, -1, 2, 4, 6, 8];

StepSizeTable = [7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, 173, 190, 209, 230, 253, 279, 307, 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899, 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767];

prevsample = 0;
previndex = 1;

Ns = length(raw_y);
n = 1;

raw_y = 32767 * raw_y;          % 16-bit operation

while (n <= Ns)
predsample = prevsample;
index = previndex;
step = StepSizeTable(index);

diff = raw_y(n) - predsample;
if (diff >= 0)
    code = 0;
else
    code = 8;
    diff = -diff;
end

tempstep = step;
if (diff >= tempstep)
    code = bitor(code, 4);
    diff = diff - tempstep;
end
tempstep = bitshift(tempstep, -1);
if (diff >= tempstep)
    code = bitor(code, 2);
    diff = diff - tempstep;
end
tempstep = bitshift(tempstep, -1);
if (diff >= tempstep)
    code = bitor(code, 1);
end

diffq = bitshift(step, -3);
if (bitand(code, 4))
    diffq = diffq + step;
end
if (bitand(code, 2))
    diffq = diffq + bitshift(step, -1);
end
if (bitand(code, 1))
    diffq = diffq + bitshift(step, -2);
end

if (bitand(code, 8))
    predsample = predsample - diffq;
else
    predsample = predsample + diffq;
end

if (predsample > 32767)
    predsample = 32767;
elseif (predsample < -32768)
    predsample = -32768;
end

index = index + IndexTable(code+1);

if (index < 1)
    index = 1;
end
if (index > 89)
    index = 89;
end

prevsample = predsample;
previndex = index;

adpcm_y(n) = bitand(code, 15);
%adpcm_y(n) = code;
n = n + 1;
end

【问题讨论】:

    标签: matlab recursion limit max


    【解决方案1】:

    发生这种情况是因为您有一个没有停止条件的递归调用自身的函数。它是无限循环的递归等价物。

    问题是函数的第二行:

    function adpcm_y = adpcm_encoder(raw_y)
    
        Y = wavread('two.wav');
        Y_en = adpcm_encoder(Y);
    

    函数的第二行再次递归调用该函数,但由于没有停止条件,所以它一直持续到你达到最大递归限制错误为止。

    【讨论】:

    • 如何达到最大递归限制错误?我该怎么办?
    • @user1103780 通常,我想到了两种方法:你可能有一个正确的函数来递归处理一个巨大的问题,或者你可能有一个不正确的函数,它总是会达到递归限制。您的函数属于后一类,因为除了前两行之外它不运行任何东西。您将递归限制设置为什么并不重要,因为adpcm_y 会进行无限递归。我不确定你想通过adpcm_y 中的递归调用来完成什么,但它现在所做的可能不是你想要的。
    【解决方案2】:

    如果你得到这个非常简单的代码,把脚本写成一个函数,这对我有一些帮助。

    例如,而不是:

    clc
    clear all
    syms s
    sys = s^2 + 2*s
    solve(s)
    

    做:

    function L8
    clc
    clear all
    syms s
    sys = s^2 + 2*s
    solve(s)
    end
    

    【讨论】:

    • 除非您调用脚本文件 solveclcsyms 或脚本中使用的任何其他函数名称,否则我看不出您如何在那里进行递归.尽管如此,将代码放入函数中总是好的。无需在函数顶部调用clear,这是编写函数比编写脚本更好的原因之一——函数总是以空工作区开始(任何输入参数除外)。
    • 还要注意clear 本身就足以清除工作区。 clear all 还会从内存中清除加载的函数,这会减慢您的代码速度并且通常没有用处。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    相关资源
    最近更新 更多