枫树序列长度

时间:2014-11-17 16:01:31

标签: sequence maple collatz

我正在尝试在Maple中创建一个基本程序,该程序在给定用户的数字(n)时运行Collat​​z序列。对于那些不知道的人,Collat​​z序列基本上是“如果给出的数字是奇数,那么3n + 1,如果是偶数,则除以2并且每个答案继续这样做。最终,答案将达到1 “ 我正在尝试获取执行序列的迭代次数,比如序列是否运行了10次,它会打印出来。这是我目前的代码:

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

到目前为止这是有效的,如果输入proc CollSeq(50),它将在50处执行Collat​​z序列,直到它达到1.我所坚持的位是序列的长度。我已经阅读并了解到我可以使用Maple的nops([])函数来获取序列的长度。这是我尝试过的:

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

我感觉这是非常错误的。任何帮助将不胜感激。

非常感谢

1 个答案:

答案 0 :(得分:0)

您的函数无法返回实际的值序列。你需要在循环中积累它。

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