2017-05-13 17 views
2

行列乗算n回を実行する再帰関数を作成しようとしています。再帰関数がエラーメッセージを返す

私のコードは次のようである:

R <- function(P, n){ 

    R(P, n-1) %*% P 

} 

この機能は、例を使用して

(P %*% P) %*% P. 

を実行するためにn = 3で呼び出されたとき、私は期待:

> P 
    [,1] [,2] [,3] 
[1,] 0.6 0.1 0.3 
[2,] 0.2 0.7 0.1 
[3,] 0.3 0.3 0.4 

しかし、I関数を呼び出すと、エラーメッセージが表示されます。

Error: evaluation nested too deeply: infinite recursion/options(expressions=)?
Error during wrapup: evaluation nested too deeply: infinite recursion/options(expressions=)?

なぜ機能がうまくいかず、コードをどのように修正する必要があるのですか教えてください。

答えて

1

すべての再帰関数には再帰呼び出しが停止する時点のしきい値が必要です。トリガーされたエラーも

evaluation nested too deeply: infinite recursion

ので、

R <- function(P, n){ 
    if (n==1) return(P) 
    R(P, n-1) %*% P 
} 

はあなたの問題を解決する必要があることを言及してあなたの定義された関数Rは、この条件を持っていません。あなたの例所与:

r1 <- (P %*% P) %*% P 
r2 <- R(P,3) 
all(r1==r2) 
#[1] TRUE 
+0

OPのデータ: 'P < - 構造(C(0.6、0.2、0.3、0.1、0.7、0.3、0.3、0.1、0.4)、.Dim = C(3L、 3L) ) ' – 989