欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【R语言】用R程序验证角谷猜想以及连续使用if语句的问题(3月8日学习笔记)

程序员文章站 2024-03-17 10:05:40
...

日本一位中学生发现一个奇妙的“定理”,请角谷教授证明,而教授无能为力,于是产生角谷猜想。猜想的内容是:任给一个自然数,若为偶数除以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语言】用R程序验证角谷猜想以及连续使用if语句的问题(3月8日学习笔记)
【R语言】用R程序验证角谷猜想以及连续使用if语句的问题(3月8日学习笔记)
【R语言】用R程序验证角谷猜想以及连续使用if语句的问题(3月8日学习笔记)
我一开始还以为是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程序验证角谷猜想的心路历程,如果表述有误或有更好的代码设计,欢迎批评指正。

相关标签: 数据可视化

上一篇: Floyd

下一篇: