My loop has an infinite recursion, and I'm not sure how to fix it?

3 visualizaciones (últimos 30 días)
Maryam Ansari
Maryam Ansari el 2 de Feb. de 2016
Comentada: Brendan Hamm el 2 de Feb. de 2016
I'm trying to implement the Babylonian method through a while loop. When I call my function in another script file, it says I have an infinite recursion. I think it has something to do with my boundary variable. I'm not quite sure how to fix it.
function y = divide_and_average(initialGuess,a,limit)
y = (initialGuess + a/(initialGuess))/2; %calculation for square
boundary = (abs(y-initialGuess)/y); % compare the limit to
while boundary > limit %will continue until false
y = initialGuess;
divide_and_average(y,a,limit);
boundary = (abs(y-initialGuess)/y);
end

Respuestas (1)

Brendan Hamm
Brendan Hamm el 2 de Feb. de 2016
You always set y to be the initial guess and call divide_and_average with y which is the initial guess.
while boundary > limit %will continue until false
y = initialGuess; % y is set to your initialGuess
% Now we call this function with the exact inputs it was originally called with. This happens infinitely.
divide_and_average(y,a,limit);
boundary = (abs(y-initialGuess)/y);
end
  5 comentarios
Brendan Hamm
Brendan Hamm el 2 de Feb. de 2016
In your while loop square takes on the value of y on every iteration but y does not change. Also, your calculation of the boundary is not correct.
function [y,error] = divide_and_average(initialGuess,a,limit)
% Calculate square based on initial guess, this is our new guess
y = (initialGuess + a/(initialGuess))/2;
error = (a - y^2)/(2*y); % This is the approximate error in the answer
while abs(error) >= limit %will continue until false
% Call the function with our new "initialGuess" and get the
% corresponding error.
[y,error] = divide_and_average(y,a,limit);
end
This is now within the appropriate tolerance:
format long
[square,err] = divide_and_average(3.9,16,1e-6)
square =
4.000000205391106
err =
-2.053911006834815e-07
Brendan Hamm
Brendan Hamm el 2 de Feb. de 2016
I highly suggest taking a look at the MATLAB Debugging options which will allow you to determine where error in your code are.

Iniciar sesión para comentar.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by