hrefspace

 找回密码
 立即注册
搜索
热搜: PHP PS 程序设计
查看: 444|回复: 8

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

[复制链接]

557

主题

557

帖子

1898

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1898
发表于 2023-10-3 08:14:31 | 显示全部楼层 |阅读模式
可以使用任何程序写代码
要求有迭代的中间结果,以及迭代的次数
回复

使用道具 举报

0

主题

172

帖子

2

积分

新手上路

Rank: 1

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

0

主题

202

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-10-3 08:15:54 | 显示全部楼层
整数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
回复

使用道具 举报

0

主题

186

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2023-10-3 08:16:35 | 显示全部楼层
2# mathematica

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

0

主题

191

帖子

159

积分

关内侯

Rank: 2

积分
159
发表于 2023-10-3 08:17:30 | 显示全部楼层
可以仅考察奇数,如果是偶数则一次性除尽所有的2,所以迭代序列中只出现奇数。
  1. num=25;(*被考察的整数*)p=NestWhileList[(3*#+1)/2^Integerexponent[#,2]&, num, #!=1&](*得到的迭代结果*)Length[p](*迭代结果的长度*)
复制代码
25的迭代结果是
  1. {25, 19, 29, 11, 17, 13, 5, 1}8
复制代码
回复

使用道具 举报

0

主题

174

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-10-3 08:17:55 | 显示全部楼层
刚搜索了一下3x+1问题,居然简单到连我都可以理解。
Forcal代码:
  1. i: SetIntStackMax[1000];i: x3(x:static,max) =   max++, printff{"{1,i}  ",x},   which[x==1, return(max) : x%2, x3(3*x+1) : x3(x/2)];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
回复

使用道具 举报

0

主题

192

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-10-3 08:18:30 | 显示全部楼层
按5楼的算法,Forcal代码:
  1. i: SetIntStackMax[1000];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)};i: printff{"\r\n结果:"}, x3[25];
复制代码
结果:25  19  29  11  17  13  5  1  
i: 8
回复

使用道具 举报

0

主题

200

帖子

41

积分

新手上路

Rank: 1

积分
41
发表于 2023-10-3 08:19:02 | 显示全部楼层
7#代码改成如下更好:
  1. i: SetIntStackMax[1000];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)}};i: printff{"\r\n结果:"}, x3[25];
复制代码
结果:25  19  29  11  17  13  5  1  
i: 8
回复

使用道具 举报

0

主题

182

帖子

76

积分

关内侯

Rank: 2

积分
76
发表于 2023-10-3 08:19:39 | 显示全部楼层
>>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
使用手册
下载
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|hrefspace

GMT+8, 2024-11-25 08:12 , Processed in 0.076605 second(s), 22 queries .

Powered by hrefspace X3.4 Licensed

Copyright © 2022, hrefspace.

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