本篇笔记在本人CSDN博客浏览效果更佳,点此链接跳转,欢迎批评指正
日本一位中学生发现一个奇妙的“定理”,请角谷教授证明,而教授无能为力,于是产生角谷猜想。猜想的内容是:任给一个自然数,若为偶数除以2,若为奇数则乘3加1,得到一个新的自然数后按照上面的法则继续演算,若干次后得到的结果必然为1。
为验证这一猜想,我想到的是通过递归的方法验证,设计程序的思路如下:
首先,验证该结果的函数需要先判断输入的或得到的数字n是否为1,如果结果为1,那说明结果得证,证明结束。
if(n==1){
return(n)
}
第二步,判断奇偶性,如果是偶数那就除以2,如果是奇数,那就乘3加1.继续递归调用自建函数。
if(n%%2==0){#该数是偶数
n <- n%/%2
Col(n)
}
else{#该数是奇数
n <- n*3+1
Col(n)
}
(最初设计这个程序的时候我犯了一个错误,在判断其为偶数后,我用的代码是
n <- n/2值得一提的是,在R语言中的整除符号是 %/% ,这点需要特别注意。)
在明确上述思路后,我第一次设计的代码为
Col <- function(n){
if(n==1){
return(n)
}
if(n%%2==0){#该数是偶数
n <- n%/%2
Col(n)
}
if(n%%2!=0){#该数是奇数
n <- n*3+1
Col(n)
}
}
如果是用Col(1)验证,那么答案是对的,输出1。但是一旦用其他自然数代入验证后,就会报如下错误
我一开始还以为是R语言包的安装问题,或者是Rstudio安装的问题,试了一次重装Rstudio,试了一次更新全部R包,还是会报上述错误。
网上说出现像这样“R Session Aborted”的错误,往往都是包安装的问题,但是我的代码一个包都没用,咋回事儿呢?
最后我的解决方式是,改代码。把代码改对以后,就不会报错了。
修改后的最终代码如下
Col <- function(n){
if(n==1){
return(n)
}
else{
if(n%%2==0){#该数是偶数
n <- n%/%2
Col(n)
}
else{#该数是奇数
n <- n*3+1
Col(n)
}
}
}
Col(17)
可以在Col()中填入任意小于7*10^11的自然数。
我反思了一下,前一段代码之所以会报错,可能是因为if语句的使用错误,再加上无休止的递归,所以断开链接,报错了。
第一次Col(1)可以成功是因为第一次if判断就收割了结果,直接return了n;放入其他自然数后没有满足条件的判断,就继续去做第二个第三个if,无限调用函数。
这个错误提醒我:
1.在R语言的代码设计中,如果要后面的判断是对前面判断的补充判断,还是需要用else语句进行情况划分,否则会报错。
2.“R Session Aborted”除了会在包使用错误的情况下出现,还可能在语法错误的情况下出现。
以上是我用R程序验证角谷猜想的心路历程,如果表述有误或有更好的代码设计,欢迎批评指正。
————————————————
版权声明:本文为CSDN博主「纸羊同学」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_46124302/article/details/104731462