2017-05-13 170 views
2

我想創建一個遞歸函數,它將執行矩陣乘法運算n次。遞歸函數返回錯誤消息

我的代碼如下:

R <- function(P, n){ 

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

} 

當這個函數被調用,n = 3執行

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

使用一個例子,我會想到:當我

> 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 

然而調用函數我收到一條錯誤消息。

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

您能向我解釋爲什麼函數不起作用以及應如何修改代碼?

回答

1

每個遞歸函數都應該有一個閾值,遞歸調用將停止。你定義的函數R不具備這個條件作爲觸發錯誤也提到

evaluation nested too deeply: infinite recursion

所以,

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

應該解決您的問題。鑑於你例如:

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