加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

话说叙拉古猜想(二)

(2023-05-19 15:33:07)
标签:

林老师

pclogo

mswlogo

fmslogo

c

分类: WinXP~7~8~10运行Logo语言
话说叙拉古猜想(二)
话说叙拉古猜想(二)
      所谓“叙拉古猜想”指的是用LOGO编程方式验证如下猜想:对于任意一个自然数,如果是偶数就除以2;如果是奇数就乘以3加上1。连续进行以上的计算,任何一个自然数最终都要得到1。编程验证验证叙拉古猜想,用PCLogo最多只能算到6位数、MSWLogo-FMSLogo可以算到15位数。叙拉古猜想是一个编程的好题目,我们能够从中学习到不少的编程知识。这里面的知识点共有三个。
      一、因为从一开始就无从知晓要计算多少个步骤才能最终得到1,所以用尾递归编程是比较得体的想法。遇到计算出来的结果是1,就终止计算。
      二、叙拉古演算必须判断一个数是奇数还是偶数。这样的判断大体上有两种方法:
      A.  0=remainder :n 2  即数字:n与2计算“求余”,就是remainder计算,假如余数为0,则说明:n是偶数,否则就是奇数。
      B.  :n/2=int(:n/2)  假如这两个表达式的值相等,那么:n就是偶数,反之就是奇数。还可以有类似的表达式。
      三、判断式可以用:ifelse……[判断成立时的运算][判断不成立时的运算],或是使用test……iffalse……iftrue……都可以。
      在输出叙拉古猜想的结果的方式上有两种:第一种就是数字输出,每一个步骤计算出来的数字原原本本给显示输出出来。另外一种就是图形输出

数字输出编程:
实例A.使用ifelse[][]编程其中:n是需要被验证的数;:b是计算需要多少个步骤的计数器;:d是叙拉古演算过程中出现的最大的数字的存储器
to xlgcx :n :b :d ;验证叙拉古猜想
  type :n type char 32  ;显示输出每一个叙拉古数
  make "b :b+1          ;统计叙拉古数的个数
  if :n=1[pr "          ;计算出了1则是终止叙拉古计算的条件
    type "计算步骤数 pr :b      ;输出步骤数
    type "其中最大的数是 pr :d  ;输出其中最大的叙拉古数
    stop]  ;终止计算
  ifelse :n/2>int(:n/2)[    ;是否是奇数逻辑判断
    make "n :n*3+1           ;如果是奇数乘以3再加上1
    if :n>:d[make "d :n]][     ;逐次需找其中更大的叙拉古数
    make "n :n/2]           ;如果是偶数则除以2
  xlgcx :n :b :d  ;尾递归继续进行叙拉古演算 
end

xlgcx 27 0 0
27 82 41 124 62 31 94 47 142 71 214 107 322 161 484 242 121 364 182 91 274 137 412 206 103 310 155 466 233 700 350 175 526 263 790 395 1186 593 1780 890 445 1336 668 334 167 502 251 754 377 1132 566 283 850 425 1276 638 319 958 479 1438 719 2158 1079 3238 1619 4858 2429 7288 3644 1822 911 2734 1367 4102 2051 6154 3077 9232 4616 2308 1154 577 1732 866 433 1300 650 325 976 488 244 122 61 184 92 46 23 70 35 106 53 160 80 40 20 10 5 16 8 4 2 1 
计算步骤数112
其中最大的数是9232

xlgcx 117 0 0
117 352 176 88 44 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 
计算步骤数21
其中最大的数是352

实例B:使用test……ifelse……iftrue……编程
to xlgcxB :n :b ;验证叙拉古猜想第二种编程
  type :n type char 32
  make "b :b+1
  if :n=1[pr "
    type "计算步骤数 pr :b stop]
  test 0=remainder :n 2
  iftrue [make "n :n/2]
  iffalse [make "n :n*3+1]
  xlgcxB :n :b
end

xlgcxB 69 0 
69 208 104 52 26 13 40 20 10 5 16 8 4 2 1 
计算步骤数15

xlgcxB 97 0 
97 292 146 73 220 110 55 166 83 250 125 376 188 94 47 142 71 214 107 322 161 484 242 121 364 182 91 274 137 412 206 103 310 155 466 233 700 350 175 526 263 790 395 1186 593 1780 890 445 1336 668 334 167 502 251 754 377 1132 566 283 850 425 1276 638 319 958 479 1438 719 2158 1079 3238 1619 4858 2429 7288 3644 1822 911 2734 1367 4102 2051 6154 3077 9232 4616 2308 1154 577 1732 866 433 1300 650 325 976 488 244 122 61 184 92 46 23 70 35 106 53 160 80 40 20 10 5 16 8 4 2 1 
计算步骤数119


图形输出编程:
优点:输出直观形象。缺点:只能处理步骤较少、数值较小的运算。太多、太大的数字在作图屏幕上无法显示输出。下面是原始被处理的数字是9及11时输出的图形实例。
话说叙拉古猜想(二)


to xlgcxC :n  ;验证叙拉古猜想图形编程
  cs ht setx -250 pd
  jg :n
end
to jg :n  ;用图形输出叙拉古数值的子程序
  pd fd :n bk :n pu sety -3 pd seth 90 label :n pu sety 0
  fd 30 seth 0 
  if :n=1 [stop]
  if 0=remainder :n 2 [jg :n/2]
  if 1=remainder :n 2 [jg :n*3+1] 
end
话说叙拉古猜想(二)


话说叙拉古猜想(二)

LOGO编程画图欣赏:
话说叙拉古猜想(二)

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有