Jadi, ini sedikit rumit dengan fungsi rekursif, karena jika Anda menginginkan hasil dari langkah-langkah perantara, Anda harus merekatkannya ke dalam sebuah daftar. Tentu saja, itu berarti ketika Anda menggunakan hasil rekursi dalam fungsi tersebut, Anda harus menggali nilai yang Anda inginkan. Kedengarannya agak berbelit-belit, tetapi dalam kasus Anda, maksud saya Anda harus mengembalikan daftar kecil phi
, j
, dan l
di setiap langkah, tetapi hanya mengeluarkan phi
saat Anda melakukan perkalian. Ini sedikit contohnya:
#the recursive function
phi <- function(phik,j,l,k,d) {
if(j==0)
list(list(phi=diag(d),j=j,l=l))
else{
if(j==1) {
if(l>k)
list(list(phi=0 * diag(d),j=j,l=l))
else
list(list(phi=phik[[l]],j=j,l=l))
}
else {
if(l>k) {
first<-phi(phik,j-1,l,k,d)
second<-list(list(phi=0 + first[[1]]$phi %*% phik[[1]], j=j,l=l))
c(second,first)
}
else {
first<-phi(phik,j-1,l+1,k,d)
second<-phi(phik,j-1,l,k,d)
third<-list(list(phi=first[[1]]$phi+(second[[1]]$phi %*% phik[[1]]), j=j, l=l))
c(third,first,second)
}
}
}
}
Anda mungkin tertarik dengan alasan saya menyarangkan hasil dalam kasus pertama hingga ketiga (ketika j
adalah 0 atau 1). Jika Anda melihat kasus-kasus lain, mungkin akan menjadi jelas. Ketika l>k
(dan j
bukan 0 atau 1), maka ada dua panggilan phi
yang dilakukan. Dalam hal ini, akan ada list
yang dikembalikan, dengan dua set phi
, i
, dan j
, jadi ini tentu merupakan list
dari list
s. Ketika saya ingin mengeluarkan phi
dari nilai yang dikembalikan, sulit untuk mengatakan apakah itu hanya list
atau list
dari list
s, jadi saya hanya membakukan semuanya ke hal yang sama.
Saya pikir pernyataan return
jelek, tetapi yang lain tidak setuju. Anda dapat menambahkannya jika Anda mau, tetapi itu sama sekali tidak diperlukan (dalam hal ini).
Beberapa contoh keluaran:
set.seed(123456)
phik <- vector(mode="list", length=3)
phik[[1]] <- matrix(rnorm(n=16,mean=0,s=1),nrow=4)
phik[[2]] <- matrix(rnorm(n=16,mean=0,s=1),nrow=4)
phik[[3]] <- matrix(rnorm(n=16,mean=0,s=1),nrow=4)
d <- nrow(phik[[1]])
k <- length(phik)
phi(phik,j=2,l=3,k,d)
# [[1]]
# [[1]]$phi
# [,1] [,2] [,3] [,4]
# [1,] -0.9087417 -2.064341 -0.9962198 0.7713081
# [2,] -2.9595280 -5.330120 -4.0488408 2.3357631
# [3,] -1.3754167 -3.866457 -0.8592336 1.4135614
# [4,] -0.1021518 -4.332802 0.4883886 -2.2130314
#
# [[1]]$j
# [1] 2
#
# [[1]]$l
# [1] 3
#
#
# [[2]]
# [[2]]$phi
# [,1] [,2] [,3] [,4]
# [1,] 0 0 0 0
# [2,] 0 0 0 0
# [3,] 0 0 0 0
# [4,] 0 0 0 0
#
# [[2]]$j
# [1] 1
#
# [[2]]$l
# [1] 4
#
#
# [[3]]
# [[3]]$phi
# [,1] [,2] [,3] [,4]
# [1,] -1.0461983 1.560074 -1.0713045 0.1582893
# [2,] -2.7488684 1.015088 0.9678209 -0.5019485
# [3,] -1.1298596 1.043994 0.1710325 -0.9659226
# [4,] -0.8616848 -1.115905 -0.8962503 -0.1137341
#
# [[3]]$j
# [1] 1
#
# [[3]]$l
# [1] 3
person
nograpes
schedule
04.02.2014