我使用了R package" Rcpp"提供的示例。并获得了负50的斐波那契项:
fib <- Rcpp::cppFunction(
'int fibonacci(const int x) {
if (x == 0) return(0);
if (x == 1) return(1);
return (fibonacci(x - 1)) + fibonacci(x - 2);
}')
fib(50)
# [1] -298632863
让我好奇地检查整个序列到F(50):
sapply(seq(50), fib)
事实证明,负面条款以F(47)开头显示:
[1] 1 1 2 3 5 8 13 21 34
.
.
[10] 55 89 144 . . .
.
.
[46] 1836311903 -1323752223 512559680 -811192543 -298632863
欢迎任何见解!
sessionInfo()
R version 3.4.0 (2017-04-21)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 14393)
Matrix products: default
locale:
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C
[5] LC_TIME=English_United States.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] compiler_3.4.0 tools_3.4.0 inline_0.3.14 Rcpp_0.12.10
答案 0 :(得分:2)
就像MrFlick评论的那样,这可能与int的范围有关。
如果我们假设这是一个32位整数,则整数可以具有的最大值是2 ^ 31-1或2,147,483,647,最小值为-2 ^ 31,第32位用于符号(积极的还是消极的)。
使用Fibonacci序列,第一个大于32位整数的数字可以处理的是第47个术语,应该是2,971,215,073,超过最大值2,147,483,647。
在十六进制中,第47项将是0xB11924E1,其被解释为整数具有符号位设置,因此被解释为负数,-1323752223。
一个简单的方法可以看到这个说明是在程序员模式下使用Windows计算器,它可以显示哪些位设置为什么数字,并且您可以在Qword(64位)和Dword(32位)之间切换以查看限制为32位。
答案 1 :(得分:0)
看起来你超过了C ++整数的最大值,即2147483647
。这是一个用R本身编写的更高效的实现,它使用循环而不是递归结构。这也避免了增长矢量。
fibo <- function(x) {
if (x == 0) {
return(0)
} else if (x %in% 1:2) {
return(1)
}
the.seq <- rep(NA, x)
the.seq[1:2] <- 1
for (i in 3:x) {
the.seq[i] <- the.seq[i - 1] + the.seq[i - 2]
}
return(the.seq[x])
}