【问题标题】:Maple Sequence Length枫序列长度
【发布时间】:2026-01-22 08:35:01
【问题描述】:

我正在尝试在 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

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

非常感谢

【问题讨论】:

    标签: sequence maple collatz


    【解决方案1】:

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

    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
    

    【讨论】: