Использовать карту (v, уменьшить) для создания последовательности Фибоначчи в R? - PullRequest
2 голосов
/ 29 мая 2020

Мне было интересно, можем ли мы использовать purrr s map и reduce для создания функции Фибоначчи, подобной этой в JavaScript:

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))

Я вижу здесь ответы Последовательность Фибоначчи в R , которые используют рекурсию, но мне было интересно, можем ли мы специально использовать purrr reduce, и если да, то как?

Ответы [ 3 ]

5 голосов
/ 29 мая 2020

Я думаю, что purrr::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

Ключ к этому решению - сохранять пары значений во время вызова accumulate(): (0,1), (1,1), (1,2), et c., Поскольку вам нужны два предыдущих значения для вычисления нового.

После этого следует извлечение первого элемента каждой пары.

3 голосов
/ 29 мая 2020

Как насчет этого подхода с 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

На основе этого ответа . Очевидно, ответ @Artem больше в духе вопроса. Так что снимаю перед ними шляпу.

2 голосов
/ 29 мая 2020

Вот решение с использованием 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

Хорошим моментом этого решения является то, что его очень легко интерпретировать. В основном вы просто используете самую базовую c функциональность уменьшения и записываете число Фибоначчи в функции, как это определено, ничего особенного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...