2016-05-18 2 views
0

Я хотел бы написать рекурсивную функцию в R, которые могли бы сделать следующее:Рекурсивные функции внутри, если еще и цикл

A_x(0) = 0 
A_x(1) = q[4,1]+q[4,2] * A_x(0) = 1 
A_x(2) = q[3,1]+q[3,2] * A_x(1) = 5 
A_x(3) = q[2,1]+q[2,2] * A_x(2) = 23 
A_x(4) = q[1,1]+q[1,2] * A_x(3) = 119 

Я написал следующий код:

n<-5 
q<-matrix(c(4,5,3,4, 2, 3, 1,2,0,1), nrow=5, ncol=2, byrow=TRUE) 
A_x <- function(x) { 
    for(i in n:0) { 
     if (x == 0) return (q[i,1])   
     else 
      return (q[i-1,1]+q[i-1,2]*A_x(x-1))  
} 
}  

Видимо это не ясный из моего кода, что я хотел бы сделать одну строку выше каждый раз, когда я делаю цикл for. Вместо этого он выглядит так, как функция всегда принимает значения из ячеек q [4,1] и q [4,2].

Любая помощь будет высоко ценится, Vesna

+4

не могли бы вы сделать 'cumsum (Rev (д [, 1])) '? – mtoto

+1

Ваш for-loop бесполезен, потому что в первом повороте он выполнит 'return()' (оставив функцию). – jogo

+0

@mtoto Извините, я дал слишком мало информации о своей проблеме. Я обновил его выше, и, к сожалению, cumsum (rev (q [, 1])) не помогает, когда в расчете больше столбцов. –

ответ

2

Попробуйте это:

A_x <- function(q, Ax, n){ 
    i <- nrow(q) - n 
    if (i == 0) q[i, 1] 
    else 
    q[i, 1] + q[i, 2] * Ax[n] 
} 

Ax <- 0 

for(i in 1:nrow(q)){ 
Ax <- c(Ax, A_x(q, Ax, i)) 
} 
Ax 

Результат:

> Ax 
[1] 0 1 5 23 119 
Смежные вопросы