找回密码
 欢迎注册
查看: 12631|回复: 8

[讨论] 实现3x+1问题的程序代码

[复制链接]
发表于 2011-2-15 14:49:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
可以使用任何程序写代码
要求有迭代的中间结果,以及迭代的次数
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2011-2-15 14:52:03 | 显示全部楼层
我用mathematica写的
  1. (*这个代码使用vim编写*)
  2. (*3x+1问题的mathematica代码*)
  3. Clear["Global`*"];(*清除所有变量*)
  4. (*定义了两个纯函数*)
  5. (*第一个纯函数表示迭代的方式,如果是偶数则除以2;如果是奇数则乘以3再加上1*)
  6. (*第二个纯函数表示判断条件,如果不等于1则一直迭代下去*)
  7. num=20;(*被考察的整数*)
  8. p=NestWhileList[If[Mod[#,2]==0, #/2,3*#+1]&, num, #!=1&](*得到的迭代结果*)
  9. Length[p](*迭代结果的长度*)
复制代码
当然出于美观的考虑,我加上代码的图片,使得其有颜色.
3x+1code.jpg
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 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
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2011-2-15 16:43:29 | 显示全部楼层
2# mathematica
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2011-2-15 16:49:59 | 显示全部楼层
可以仅考察奇数,如果是偶数则一次性除尽所有的2,所以迭代序列中只出现奇数。
  1. num=25;(*被考察的整数*)
  2. p=NestWhileList[(3*#+1)/2^Integerexponent[#,2]&, num, #!=1&](*得到的迭代结果*)
  3. Length[p](*迭代结果的长度*)
复制代码
25的迭代结果是
  1. {25, 19, 29, 11, 17, 13, 5, 1}
  2. 8
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2011-2-15 19:47:34 | 显示全部楼层
刚搜索了一下3x+1问题,居然简单到连我都可以理解。
Forcal代码:
  1. i: SetIntStackMax[1000];
  2. i: x3(x:static,max) =
  3.    max++, printff{"{1,i}  ",x},
  4.    which[x==1, return(max) : x%2, x3(3*x+1) : x3(x/2)];
  5. i: printff{"\r\n结果:"}, x3[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  
i: 27
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2011-2-15 20:03:31 | 显示全部楼层
按5楼的算法,Forcal代码:
  1. i: SetIntStackMax[1000];
  2. i: x3(x:static,max) = which{x%2, {printff("{1,i}  ",x), max++, which[x==1, return(max) : x3(3*x+1)]} : x3(x/2)};
  3. i: printff{"\r\n结果:"}, x3[25];
复制代码
结果:25  19  29  11  17  13  5  1  
i: 8
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2011-2-15 20:16:44 | 显示全部楼层
7#代码改成如下更好:
  1. i: SetIntStackMax[1000];
  2. i: x3(x:static,max) = which{x%2, {printff("{1,i}  ",x), max++, which[x==1, return(max) : x3(3*x+1)]} : {while[!(x%2),x=x/2], x3(x)}};
  3. i: printff{"\r\n结果:"}, x3[25];
复制代码
结果:25  19  29  11  17  13  5  1  
i: 8
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 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
使用手册
下载
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-4-27 13:24 , Processed in 0.050026 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表