如何在R

时间:2017-06-03 14:39:16

标签: r function recursion

我想在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),我不知道 程序中的哪一部分是错误的。任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分: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,5)必须计算
P_n_m(49,7,4)必须计算
P_n_m(49,7,3)必须计算
P_n_m(49,7,2)必须计算
P_n_m(49,7,1)我们有m == 1但不是n == 0,r& 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)下降到负无穷大。

您需要重新考虑功能的定义。