楼主: jmpamao
2424 13

[问答] 一个数学编程问题 [推广有奖]

  • 7关注
  • 16粉丝

已卖:6份资源

副教授

93%

还不是VIP/贵宾

-

TA的文库  其他...

R_JULIA_learning

威望
0
论坛币
1815 个
通用积分
98.3943
学术水平
134 点
热心指数
183 点
信用等级
88 点
经验
23214 点
帖子
584
精华
0
在线时间
1523 小时
注册时间
2011-1-18
最后登录
2024-12-13

初级热心勋章

楼主
jmpamao 发表于 2012-11-30 11:44:46 |AI写论文
50论坛币
213858t7tl2gwtuugw19ea.gif

xz <- function(n){
    if(n<=0){print("要求正整数")
    }else{ i =0
           while(n!=1){
             if(n%%2==0){n=n/2
             }else{
               n <- 3*n+1
             }
             print(paste(n,"跟踪n",sep=","))#看看n是怎么样的一个变化过程
             i = i+1
           }
           print(paste(n,"结果运行ok",paste("循环次数为",i,sep=":"),sep=","))  
    }
  }
此程序 可以知道 输入一个正整数,循环到 1, 可以知道循环次数

现在想知道 按照此规则,如果知道了循环次数,能否知道 此数的集合?
循环次数                                数值
      i                                       数值                 2*n    or   if( (n-1)%%3==0 ) (n-1)/3
     1                                         2
     2                                  4          x             2*n      if( (n-1)/3==0 ) FLASE  x 代表没有数值
     3                              8       x        
     4                         16     x
     5                     32      5             #    (16-1)%%3==0  TRUE    (16-1)/3=5
     6                 64   x  10   x
     7            128  21   20   3  
     8        256  x 42 x 40 x 6 x
    9     512  85  84 x 80 13 12 x
   10  1024x170 28 168 x 160 x 26 4 24 x   
    ..      ...................................
此算法遇到的问题, 在循环9次后, 13 是其中一个数, 对应于 循环10次的26 和4, 但是 4是循环2次的数, 怎么把 4去掉?
谢谢!


谢谢 TaskShare 的提醒,顿悟 在奇数的情况下 才是3n+1, 反过来,在知道循环数的情况下, (n-1)/3 得到数必须是奇数。。。
#知道循环次数的情况下,数据的集合
xz.c <- function(m){
  n <-2
  if(m==1){ n=2
  }  else{i=2
          while(i <=m){
            k <-c();j <- c()
            k <- 2*n; j <-(n-1)/3
            j <-j[(n-1)%%3==0&j!=1&j%%2!=0]    #能n-1被3整除,j是奇数且不等于1
            n <-c(k,j)
            i =i+1
          }
  }
  print(n)
  print(length(n))
}

#输入一个正整数,能够知道 循环的次数
xz <- function(n){
  if(n<=0){print("要求正整数")
  }else{ i =0
         while(n!=1){
           if(n%%2==0){n=n/2
           }else{
             n <- 3*n+1
           }
           
           i = i+1
         }
         print(paste(n,"结果运行ok",paste("循环次数为",i,sep=":"),sep=","))  
  }
}

这两个程序相互对应,大家帮忙相互检测下,谢谢





最佳答案

TaskShare 查看完整内容

按我对你的要求的理解,试着回答你的问题: 从13算出26和4时,要想剔除4这个不对的数字,我觉得只需要加个简单的检验:即倒算回去是13吗。即如下: - 检验26:按你的规则:26是个偶数,所以26/2,是13。所以26通过检验。 - 检验4:按你的规则:4是个偶数,所以4/2,不是13。所以4不通过检验。这样4就被排除了。 所以,你的程序中需要加入个上述的检验步骤。 具体的程序语句靠你了,因为我没学过R语言。
关键词:学编程 编程 数学

沙发
TaskShare 发表于 2012-11-30 11:44:47
按我对你的要求的理解,试着回答你的问题:

从13算出26和4时,要想剔除4这个不对的数字,我觉得只需要加个简单的检验:即倒算回去是13吗。即如下:
- 检验26:按你的规则:26是个偶数,所以26/2,是13。所以26通过检验。
- 检验4:按你的规则:4是个偶数,所以4/2,不是13。所以4不通过检验。这样4就被排除了。
所以,你的程序中需要加入个上述的检验步骤。

具体的程序语句靠你了,因为我没学过R语言。
已有 2 人评分经验 学术水平 热心指数 信用等级 收起 理由
ltx5151 + 20 根据规定进行奖励
jmpamao + 1 + 1 + 1 谢谢 提醒了 奇数 3n+1 -&gt; n

总评分: 经验 + 20  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

藤椅
jmpamao 发表于 2012-11-30 11:45:51
xz.c <- function(m){
  n <-2
  if(m==1){ n=2
}  else{i=2
        while(i <=m){
  k <-c();j <- c()
    k <- 2*n; j <-(n-1)/3
     j <-j[(n-1)%%3==0&j!=1]
    n <-c(k,j)
    i =i+1
    }
}
  print(n)
}

编个一个有bug的程序。

板凳
qoiqpwqr 发表于 2012-11-30 12:15:05
你还在搞这个啊?

报纸
jmpamao 发表于 2012-11-30 12:18:17
qoiqpwqr 兄, 帮想想撒

地板
qoiqpwqr 发表于 2012-11-30 12:33:24
jmpamao 发表于 2012-11-30 12:18
qoiqpwqr 兄, 帮想想撒
这个太复杂,我的想法就是穷举

7
jmpamao 发表于 2012-11-30 21:06:44
qoiqpwqr 发表于 2012-11-30 12:33
这个太复杂,我的想法就是穷举
穷举。。。

循环次数 和数集还是有规律的,
循环i[n],数的集合里,剔去1:i[n-1]重复出现的数,应该剩下是 此循环次数的 数了。。。
比如循环10次时, 出现了 4, 而4是之前出现的,把它剔去。

可以试试看
呵呵
有点头大。。。

8
trier2006 发表于 2012-12-1 14:51:51
帮顶
最好的医生是自己,最好的药物是时间……

9
TaskShare 发表于 2012-12-1 15:48:08
我在8楼写的是不是可以解决你的问题?如果不是,可告知,我可再想想。

10
jmpamao 发表于 2012-12-2 18:09:06
TaskShare 发表于 2012-12-1 15:45
按我对你的要求的理解,试着回答你的问题:

从13算出26和4时,要想剔除4这个不对的数字,我觉得只需要加 ...
谢谢你 提醒了我,按照规则是  原题中 奇数是 将3n+1赋予给n
那就是 说知道循环次数 要求数的集合 上面的一个数  (n-1)/3 得出的必须是奇数而不是 偶数

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-7 01:20