2017-06-03 59 views
0

我想在R中編寫一個程序來計算一個值,程序如下。如何在R中編寫雙遞歸函數

 options(expressions = 5e5) 
    P_n_m=function(r,n,m) { 
     if(r >0 & n==1 & m==0 | r >=0 & n==0 & m==1) return(1) 
     else if(r >= 0 & n >= 0 | r >= 0 & m >= 0){ 
     return(n/(n+m)*P_n_m(r-n-m,n-1,m)+m/(n+m)*P_n_m(r,n,m-1)) 
     } 
     else return(0) 
    } 

但它總是給我錯誤。我也嘗試調整系統設置, 但它仍然沒有工作。我想計算P_n_m(49,7,7),並且我不知道 程序中的哪個部分是錯誤的。任何人都可以幫我解決這個問題嗎?

回答

2

你的函數有一個無限的遞歸。

當您計算P_n_m(r,n,m)時,您必須同時計算 P_n_m(r-n-m,n-1,m)P_n_m(r,n,m-1)。注意,第二項只有 減少m,但保持r和n不變。 這會導致無限遞歸。

我們跟蹤您的示例P_n_m(49,7,7)。它必須計算 (除其他事項外)
P_n_m(49,7,6),它具有計算
P_n_m(49,7,4),它具有計算
P_n_m(49,7,5),它必須計算
P_n_m(49,7,3)必須計算
P_n_m(49,7,2)必須計算
P_n_m(49,7,1)我們有m == 1但不是n == 0,所有我們需要
P_n_m(49,7,0)我們有m == 0但不是n == 1,兩個r & n> 0所以我們需要
P_n_m(49 ,7,-1),現在我們需要
P_n_m(49,7,m)降至負無窮。

您需要重新考慮函數的定義。

+0

謝謝,我修改我的條件,現在它的工作! – woowah