2

我在我的R课上做一个练习,希望你能帮到你。任务是创建我自己的脚本来确定一个数字是否是回文。我的想法是创建一个重复结构,以任意大小记录每个数字,按顺序比较这些数字,然后判断该数字是否为回文。

到目前为止,我认为我可以使用“for”命令来分解数字,如下所示:

# Initialize
Number <- 242   
Number

N <- nchar(Number)    
N

# Find numbers and digits
if (Number == 0) {
    print ("Number must be greater than 0")
}

if (Number < 0) {
    print ("Number must be greater than 0")
}

for (i in 1:N) {
    print (Number)
    Digit <- Number %/% 10^(N-1)
    print (Digit)
    Number <- Number %% 10^(N-1)
    N <- N-1
}

但是,问题在于,由于此结构会覆盖每个循环中的变量,因此一旦循环完成,我就无法单独打印所有数字。我可以命令 R 打印并记录每个循环中产生的数字,以便它们可以在下游相互比较并用于评估原始数字是否是回文?谢谢你的帮助。

4

2 回答 2

2

有更好的方法来检查 R 中的回文性,您应该看到其他答案。对于在 for 循环期间跟踪事物的特定问题,一种方法是制作一个与 for 循环一样长的向量,并在循环的第 th 次迭代中分配给i向量的第 th 个元素。i

Number <- 12345
N <- nchar(Number)
backwardsDigits <- numeric(N) ## a vector of numerics of length N
for (i in N:1) {
    backwardsDigits[i] <- Number %/% 10^(i-1)
    Number <- Number %% 10^(i-1)
}

backwardsDigits

all(backwardsDigits == rev(backwardsDigits))

您可以通过在循环中forwardsDigits写入来代替。forwardsDigits[N - i + 1]在循环过程中你真的不需要print任何东西,尽管它对调试很有帮助。

于 2012-09-24T02:30:16.917 回答
1

正如@thelatemail 建议的那样,还有另一种(也许更直观的方式)可以做到这一点。

首先,让我们将数字 117711 转换为字符串并将其拆分。

charsplit <- strsplit(as.character(117712), "")

[[1]]
[1] "1" "1" "7" "7" "1" "2"

然后,我们将它从列表形式中取出并反转它

revchar <- rev(unlist(charsplit))

[1] "2" "1" "7" "7" "1" "1"

最后,我们将它们粘贴在一起并将它们转换为数字:

palinum <- as.numeric(paste(revchar, collapse=""))

[1] "217711"

然后我们可以检查它们是否相同:

117712 == palinum

[1] FALSE

我们甚至可以编写一个函数来为我们做这件事。

is.palindrome <- function(number){
  charsplit <- strsplit(as.character(number), "")
  revchar <- rev(unlist(charsplit))
  palinum <- as.numeric(paste(revchar, collapse=""))

  number==palinum
}

is.palindrome(117712)
[1] FALSE

is.palindrome(117711)
[1] TRUE
于 2012-09-24T03:16:00.680 回答