2013-02-16 5 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); 

유일한 방법 (내가 알고 오전)을 종료하기를 그 반환 문을 사용하는 것입니다. 그러나,이 다양한 함수의 출력을 기본 작업 영역의 변수에 할당하려고합니다. 내가 좋아하는 어떤 일을 할 :

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가 할당되는으로부터 방지 할 수 있습니다.

솔루션에 대한 아이디어 중 일부는 전역 또는 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 호출, 알고리즘에 따라 어쩌면 이전에 함수를 종료 할.