2015-11-25 6 views
-3

Мне бы хотелось узнать наиболее эффективный (подумайте, код И скорость, если я буду запускать его на очень больших векторах или объектах), чтобы вычислить рекурсивную функцию на векторе , (для вычисления S [i] нам просто нужно S [k] с точностью до k < = (i-1) и V [k] с k < = i)Рекурсивная функция в R, примененная к вектору

Простым примером будет присвоение num vector v of длина N, чтобы вернуть вектор S, где S [I] представляет собой сумму первых г элементов ст.

в данном конкретном случае (for) петли довольно некрасиво ... и (изм) так не эффективно делать что-то вроде

myfun <- function(i){sum(length_table[1:i])} 
     S <- sapply(v,myfun)) 

не хорошо из-за многие ненужные расчеты ...

любые предложения?

EDIT: Для меня нет слишком большой разницы между итерационным и рекурсивным. Я не знал о функции cumsum, которая решает проблему в этом конкретном случае.

ok Теперь давайте рассмотрим более общий случай, когда у нас есть (num) функция f, которая принимает два (num) аргумента, так что f (x, y) также является значением num. нам нужно также «семя». дан Num вектор v длины N,

я хотел бы построить вектор U, определяемый

U[1] = f(v[1],seed) 
U[2] = f(v[2],U[1]) 
U[3] = f(v[3],U[2])... 

U[N] = f(v[N],U[N-1]) 

есть хороший эффективный способ сделать это без зацикливания?

+3

Вы ищете ' f <- функция (v, i) cumsum (v [1: i]) '? –

+1

Ваш вопрос непонятен: если суммарная сумма является всего лишь примером (с хорошо известным решением, по выражению пользователя Pierre), какова ваша фактическая проблема? –

+1

Согласен с обоими комментариями. Кроме того, предпосылка hte вопроса о том, что рекурсивные решения будут векторизовать, неверна. R хорошо известен хорошей поддержкой векторизованных решений и плохой поддержкой рекурсивных. Кроме того, иллюстрированный код не является действительно рекурсивным, но итеративным. –

ответ

1

Вот два способа реализации этого в R (и в то время как уменьшить может показаться более элегантным, мой опыт показывает, что более склонны к (моей) замешательства):

> y <- numeric(); y[1] <- 1; for(i in 2:10){ y[i] <- 3+y[i-1]*2} 
> y 
[1] 1 5 13 29 61 125 253 509 1021 2045 

> Reduce(function(x,y){ y= 3+ x*2}, 1:10, accumulate=TRUE) 
[1] 1 5 13 29 61 125 253 509 1021 2045 
Смежные вопросы