Collatz Conjecture using for loop

38 vues (au cours des 30 derniers jours)
B
B le 17 Sep 2021
Commenté : B le 17 Sep 2021
Consider the following algorithm
  • start with positive integer
  • if the number is even, divide by 2 if not multiply it by 3 and add one
  • repeat the process until the number 1 is obatined
We ae required to create a function that takes two inputs 'n'=positive integer and 'max_steps' and returns the number of steps rquired to reach 1. The function is meant to be such that if the number of steps reaches the value 'max_steps'(without the algorithm reaching 1) it returns Nan. The code has to use a for loop and at least 1 if statement
N='Nan';
steps = 0;
while n~=1;
if mod(n,2) == 0;
n = n/2;
else
n = 3*n + 1;
end
steps=steps+1;
end
if steps>max_steps
disp=(N);
end
Most of the code is correct expect i cant seem to get 'Nan' when the number of steps reaches the value 'max_steps' and dont know i can implement a for loop
Any help will appreciated

Réponse acceptée

John D'Errico
John D'Errico le 17 Sep 2021
Your code is close to a working algorithm.
There are some issues truly good code would worry about. Could you ever have an overflow issue? I'm not talking about overflowing the realmax value for a double, but instead, the largest possible integer a double can represent exactly and unambiguously. This is flintmax in MATLAB.
flintmax
ans = 9.0072e+15
And flintmax might not be that terribly a huge number in this context. flintmax is 2^53-1. So good code would worry about that. Perhaps you can gain a little headroom, by using uint64 to represent your integers.
First, this must be a function. Displaying a result in NOT the same thing as returning a value from a function. So your code should be wrapped in a function, like this:
function steps = collatz(n,max_steps)
end
Now I'll put your while loop in there.
function steps = collatz(n,max_steps)
steps = 0;
while n~=1
if mod(n,2) == 0;
n = n/2;
else
n = 3*n + 1;
end
steps=steps+1;
end
end
But this never worries about how to stop that loop when there is a problem. So we need to do more. One idea is to use the break command, when max_steps is exceeded. Another idea is to change the value of N to a NaN, and then to put that into the test for the while loop.
function steps = collatz(n,max_steps)
steps = 0;
while n~=1 && ~isnan(n)
% the collatz iteration
if mod(n,2) == 0;
n = n/2;
else
n = 3*n + 1;
end
steps=steps+1; % increment the steps counter.
if (steps >= max_steps) && (n~=1) % have we gone too far?
n = NaN;
end
end
end
As you can see, this version will overwrite the value of n is we have hit the step counter limit. And then the while loop will fail.
The alternative is to use break.
function steps = collatz(n,max_steps)
steps = 0;
while n~=1
% the collatz iteration
if mod(n,2) == 0;
n = n/2;
else
n = 3*n + 1;
end
steps=steps+1; % increment the steps counter.
if (steps >= max_steps) && (n~=1) % have we gone too far?
n = NaN;
break
end
end
end
And of course, there are surely other ways you might write it.
  1 commentaire
B
B le 17 Sep 2021
thanks alot

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Loops and Conditional Statements dans Help Center et File Exchange

Produits


Version

R2021a

Community Treasure Hunt

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

Start Hunting!

Translated by