使用map(v,reduce)在R?

使用map(v,reduce)在R?,r,purrr,R,Purrr,我想知道我们是否可以使用purr的map和reduce创建类似于JavaScript中的Fibonacci函数: function fib(n){ return new Array(n).fill(1).reduce((arr, _ ,i) => { arr.push((i <= 1) ? i : arr[i-2] + arr[i-1]) return arr },[]) ; } console.log(fib(10)) 函数fib(n){ 返回新数组(n)

我想知道我们是否可以使用
purr
map
reduce
创建类似于JavaScript中的Fibonacci函数:

function fib(n){
  return new Array(n).fill(1).reduce((arr, _ ,i) => {
    arr.push((i <= 1) ? i : arr[i-2] + arr[i-1])
    return arr
  },[]) ;
}
console.log(fib(10))
函数fib(n){
返回新数组(n).fill(1).reduce((arr,u,i)=>{

arr.push((i我认为
purr::accumulate()
更适合此任务:

n <- 10                                         # Desired number of values
purrr::accumulate( .init = c(0L,1L),            # Starting with (0,1)
                   rep(0,n),                    # Accumulate n times
                   ~c(.x,sum(.x))[2:3]          # (x,y) -> (x, y, x+y)[2:3]
                 ) %>% 
    purrr::map_int( `[`, 1 )                    # (x,y) -> x

# [1]  0  1  1  2  3  5  8 13 21 34 55
n(x,y,x+y)[2:3]
) %>% 
purrr::map_int(`[`,1)#(x,y)->x
# [1]  0  1  1  2  3  5  8 13 21 34 55
此解决方案的关键是在整个
accumulate()
调用中保持成对的值:
(0,1)
(1,1)
(1,2)
,等等,因为您需要两个以前的值来计算新值


然后检索每对的第一个元素。

使用
map
这种方法怎么样

n<-10
map(n,function(x) round(((5+sqrt(5))/10) * ((1+sqrt(5))/2) ** (1:x-1)))
[[1]]
 [1]  1  1  2  3  5  8 13 21 34 55

n这里有一个使用reduce的解决方案

fib <- function(n) reduce(rep(0,n-1), .f=function(x,y) c(x, x[length(x)-1] + x[length(x)]), .init=c(0,1))

fib(10)
# [1]  0  1  1  2  3  5  8 13 21 34 55
fib