mathematica 发表于 2011-2-15 14:49:28

实现3x+1问题的程序代码

可以使用任何程序写代码
要求有迭代的中间结果,以及迭代的次数

mathematica 发表于 2011-2-15 14:52:03

我用mathematica写的(*这个代码使用vim编写*)
(*3x+1问题的mathematica代码*)
Clear["Global`*"];(*清除所有变量*)
(*定义了两个纯函数*)
(*第一个纯函数表示迭代的方式,如果是偶数则除以2;如果是奇数则乘以3再加上1*)
(*第二个纯函数表示判断条件,如果不等于1则一直迭代下去*)
num=20;(*被考察的整数*)
p=NestWhileList==0, #/2,3*#+1]&, num, #!=1&](*得到的迭代结果*)
Length(*迭代结果的长度*)当然出于美观的考虑,我加上代码的图片,使得其有颜色.

mathematica 发表于 2011-2-15 14:54:20

整数200的结果是
{200, 100, 50, 25, 76, 38, 19, 58, 29, 88, 44, 22, 11, 34, 17, 52, \
26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1}
和27

wayne 发表于 2011-2-15 16:43:29

2# mathematica
:)

hujunhua 发表于 2011-2-15 16:49:59

可以仅考察奇数,如果是偶数则一次性除尽所有的2,所以迭代序列中只出现奇数。num=25;(*被考察的整数*)
p=NestWhileList[(3*#+1)/2^Integerexponent[#,2]&, num, #!=1&](*得到的迭代结果*)
Length(*迭代结果的长度*)25的迭代结果是{25, 19, 29, 11, 17, 13, 5, 1}
8

forcal 发表于 2011-2-15 19:47:34

刚搜索了一下3x+1问题,居然简单到连我都可以理解。
Forcal代码:i: SetIntStackMax;
i: x3(x:static,max) =
   max++, printff{"{1,i}",x},
   which;
i: printff{"\r\n结果:"}, x3;结果:200100502576381958298844221134175226134020105168421
i: 27

forcal 发表于 2011-2-15 20:03:31

按5楼的算法,Forcal代码:i: SetIntStackMax;
i: x3(x:static,max) = which{x%2, {printff("{1,i}",x), max++, which} : x3(x/2)};
i: printff{"\r\n结果:"}, x3;结果:25192911171351
i: 8

forcal 发表于 2011-2-15 20:16:44

7#代码改成如下更好:i: SetIntStackMax;
i: x3(x:static,max) = which{x%2, {printff("{1,i}",x), max++, which} : {while[!(x%2),x=x/2], x3(x)}};
i: printff{"\r\n结果:"}, x3;结果:25192911171351
i: 8

haifeng 发表于 2023-2-7 11:52:15

>>Collatz(200)
in> Collatz(200)
200-->100-->50-->25-->76-->38-->19-->58-->29-->88-->44-->22-->11-->34-->17-->52-->26-->13-->40-->20-->10-->5-->16-->8-->4-->2-->1

out> 26

------------------------

By Calculator
使用手册
下载
页: [1]
查看完整版本: 实现3x+1问题的程序代码