Fungsi rekursif: Simpan keluaran setiap panggilan ke daftar

Saya ingin menyimpan output dari setiap pemanggilan fungsi dari fungsi rekursif berikut ke dalam daftar. Selain itu, saya perlu mengetahui pasangan (j,l) mana yang sesuai dengan entri mana dalam daftar yang dihasilkan.

Saya telah membuat versi sederhana untuk mereproduksi masalah. Harap beri tahu saya jika saya harus memberikan informasi lebih lanjut untuk membantu menyelesaikan masalah. Bantuan apa pun sangat dihargai. Terima kasih.

#the recursive function
phi <- function(phik,j,l,k,d) {
  if(j==0) {
    diag(d)
  }
  else{
    if(j==1) {
      if(l>k) {
        0 * diag(d)
      }
      else{
        phik[[l]]      
      }      
    }
    else {
      if(l>k) {
        0 + phi(phik,j-1,l,k,d) %*% phik[[1]]
      }
      else {
        phi(phik,j-1,l+1,k,d) + phi(phik,j-1,l,k,d) %*% phik[[1]]
      }      
    }
  }
}

#related stuff
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)

#function call
phiout <- phi(phik,j=10,l=1,k=k,d=d)

person Andy    schedule 04.02.2014    source sumber
comment
Anda tidak menghasilkan keluaran apa pun; Anda mengembalikan nilai.   -  person sds    schedule 05.02.2014


Jawaban (1)


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 lists. Ketika saya ingin mengeluarkan phi dari nilai yang dikembalikan, sulit untuk mengatakan apakah itu hanya list atau list dari lists, 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