Search code examples
sequencemaplecollatz

Maple Sequence Length


I'm trying to create a basic program in Maple that runs the Collatz sequence when given a number (n) from the user. For those that don't know, the Collatz sequence is basically "If the number given is odd, do 3n + 1, if it is even, divide by 2 and continue to do so for every answer. Eventually, the answer will reach 1" I'm trying to grab the number of iterations that the sequence is performed, say if the sequence is run through 10 times, it prints that out. Here is my current code:

Collatz := proc (n::posint) 
if type(n, even) then (1/2)*n 
else 3*n+1 
end if 
end proc

CollSeq := proc (n::posint) 
local i; 
i := n; 
while 1 < i do 
lprint(i); 
i := Collatz(i) 
end do 
end proc

This so far works, and if the proc CollSeq(50) is entered, it will perform the Collatz sequence on 50 until it reaches 1. The bit I am stuck on is the length of the sequence. I have read around and learned that I might be able to use the nops([]) function of Maple to get the length of the sequence. Here is what I have tried:

CollLen := proc (n::posint) 
local c; 
c := CollSeq(n); 
print(nops([c])) 
end proc

I have a feeling this is horribly wrong. Any help would be much appreciated.

Many Thanks


Solution

  • Your function fails to return the actual sequence of values. You need to accumulate it as you go through the loop.

    CollSeq := proc (n::posint) 
        local i, s; 
        i := n; 
        s := i; 
        while 1 < i do
            lprint(i);
            i := Collatz(i);
            s := s, i;
        end do;
        s;
    end proc