2013-02-16 27 views
0

以下只是一個簡單的例子來概括和說明我遇到的問題。在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。但是,有沒有更簡單的方法,我錯過了。我只是想將這種風格的函數的輸出傳遞迴基礎工作空間?

一個測試用例,以防萬一:

[email protected](x) -x-cos(x); [email protected](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); 

感謝您的快速幫助!

回答

1

你的示例函數幾乎不起作用。您只需在最後一行指定

out = newtraph(...) 

以便您可以捕獲輸出。

當您報告「修正猜測」時,您可能還需要指定= 0或某個虛擬值,以便代碼的分支也將返回一個值。

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); 
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次調用中,這取決於你的算法。