在matlab中打破递归函数调用

时间:2013-02-16 01:37:39

标签: matlab

以下只是一个简单的例子来概括和说明我遇到的问题。

如果我有以下功能:

function newtraph(initialguess,funct,dfunct)
ht = funct(initialguess);
if abs(ht) < 10^(-6)
    disp(initialguess); return
elseif abs(ht) > 10^6
    disp('Fix Guess'); return
end
newtraph(initialguess-(ht/dfunct(initialguess)), funct, dfunct);

退出的唯一方法(我知道)是通过使用那些return语句。但是,我想将此类函数的输出分配给基础工作区中的变量。我想做一些事情:

function out = newtraph(initialguess,funct,dfunct)
ht = funct(initialguess);
if abs(ht) < 10^(-6)
    out = initialguess; return
elseif abs(ht) > 10^6
    disp('Fix Guess'); return
end
newtraph(initialguess-(ht/dfunct(initialguess)), funct, dfunct);

这不起作用,return阻止分配。

Output argument "out" (and maybe others) not assigned

我对解决方案的一些想法是使用全局变量或evalin。但是有一些我想念的简单方法。我只想将此样式的函数输出传递回基础工作区?

一个测试用例,以防万一:

funct=@(x) -x-cos(x); dfunct=@(x) sin(x)-1; initialguess=1;

感谢您的时间。

嗯,我是个白痴。这只是忘记最终任务的一个例子:

function out = newtraph(initialguess,funct,dfunct)
ht = funct(initialguess);
if abs(ht) < 10^(-6) %Tolerance
    out = initialguess; return
elseif abs(ht) > 10^6
    out=0; return
end
out = newtraph(initialguess-(ht/dfunct(initialguess)), funct, dfunct);

感谢您的快速帮助!

3 个答案:

答案 0 :(得分:1)

你的示例函数几乎没有用。你只需要分配

out = newtraph(...)

在最后一行,这样你就可以捕获输出。

当您报告“fix guess”时,您可能还需要指定= 0或一些虚拟值,以便代码的分支也将返回一个值。

答案 1 :(得分:0)

这里只是一个猜测:你不是错过了最后一行的作业吗?如果以前没有分配出来,你也不需要在你的elseif中初始化吗?即

ht = funct(initialguess);
if abs(ht) < 10^(-6)
    out = initialguess;
    return
elseif abs(ht) > 10^6
    disp('Fix Guess');
    if ~exist('out')
       out=1;  % you need some default value if you ever reach this code without ever initializing out
    end
    return
end
out = newtraph(initialguess-(ht/dfunct(initialguess)), funct, dfunct);

答案 2 :(得分:0)

这个答案可能有点晚,但我认为值得在这里指出是非常重要的。为了使递归更清晰,我建议采用另一种方法。

function out = newtraph(initialguess,funct,dfunct,counter)
maxCount = % yourValue;
ht = funct(initialguess);
if abs(ht) > 10^(-6) || abs(ht) < 10^6 || counter<maxCount % Break out after x tries
    counter = counter+1;
    out = newtraph(initialguess-(ht/dfunct(initialguess)), funct, dfunct,counter);
elseif abs(ht) < 10^(-6) %Tolerance
    out = initialguess;
else
    warning('Convergence were not reached!');
    out=0;
end

优先结构可能是个人的,但这样很明显,你一直坚持到达停止标准,即函数收敛或发散。

此外,递归函数是危险的,因为停止它们的唯一方法是满足退出条件或程序崩溃。 Matlab有一个限制,递归可以继续多少次然后抛出错误。您很可能希望自己处理错误(就像您已经设置out=0;一样)。 matlabs限制也是500个递归调用,你很可能想要提前终止函数,可能是8-20个调用,具体取决于你的算法。