1

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

我有一种感觉,这是非常错误的。任何帮助将非常感激。

非常感谢

4

1 回答 1

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
于 2014-11-17T17:17:05.003 回答