R中的KnapSack动态编程具有递归函数

时间:2016-10-24 15:49:37

标签: r recursion knapsack-problem

我在R中创建了这个简单的代码来解决带有递归函数的Knapsack程序

n <- c(0,1,2,3,4)
v <- c(10,40,30,50)
w <- c(5,4,6,3)
k <- 10


myfunction  <- function(n,k){
  if (n==0 | k==0){
  output <- 0
  } else if (w[i] > k) {
        output <- myfunction[i-1,w]
  } else {
        output <- max(v[i]+ myfunction(i-1, k-w[i]),myfunction(i-1,k))
      }
return(myfunction)
}

但是,我没有得到一个值作为输出,但整个功能。例如,如果我输入:     MyFunction的(4,10)

我没有得到90的值,但整个功能都输入了。

enter image description here

这些是值

1 个答案:

答案 0 :(得分:6)

除了@etienne指出的错误之外,还有一些错误。这是一个带注释的调试会话。首先我们修复返回的对象:

> myfunction  <- function(n,k){
+   if (n==0 | k==0){
+   output <- 0
+   } else if (w[i] > k) {
+         output <- myfunction[i-1,w]
+   } else {
+         output <- max(v[i]+ myfunction(i-1, k-w[i]),myfunction(i-1,k))
+       }
+ return(output)
+ }
> myfunction(4,10)
Error in if (w[i] > k) { : argument is of length zero

显然,w和k都不是长度为零,这表明它必须是i。 (正如艾蒂安所指出的那样)。看看你的代码,看起来你实际上希望i成为在满足终止条件之前减少的索引。因此,在出现的几个实例中,将n替换为i

> myfunction  <- function(i,k){
+   if (i==0 | k==0){
+   output <- 0
+   } else if (w[i] > k) {
+         output <- myfunction[i-1,w]
+   } else {
+         output <- max(v[i]+ myfunction(i-1, k-w[i]),myfunction(i-1,k))
+       }
+ return(output)
+ }
> myfunction(4,10)
Error in myfunction[i - 1, w] : 
  object of type 'closure' is not subsettable

所以你也犯了使用方括号的错误,其中需要括号(在世界上非美国部分的括号中):

> myfunction  <- function(i,k){
+   if (i==0 | k==0){
+   output <- 0
+   } else if (w[i] > k) {
+         output <- myfunction(i-1,w)
+   } else {
+         output <- max(v[i]+ myfunction(i-1, k-w[i]),myfunction(i-1,k))
+       }
+ return(output)
+ }
> myfunction(4,10)
[1] 90

成功,差不多。大多数警告是因为您在其中一个条件中使用了|而不是||

Warning messages:
1: In if (i == 0 | k == 0) { :
  the condition has length > 1 and only the first element will be used
2: In if (w[i] > k) { :
  the condition has length > 1 and only the first element will be used
3: In if (i == 0 | k == 0) { :
  the condition has length > 1 and only the first element will be used
4: In if (i == 0 | k == 0) { :
  the condition has length > 1 and only the first element will be used
5: In if (i == 0 | k == 0) { :
  the condition has length > 1 and only the first element will be used
6: In if (i == 0 | k == 0) { :
  the condition has length > 1 and only the first element will be used

所以用逻辑||替换该实例。为了处理似乎没有破坏你的逻辑的其他警告,在w[i]时意识到i == 0的长度为0,所以在首次测试该可能性的条件中添加一个逻辑子句并使用正确的&#34;双重和符号&#34; (&&):

myfunction  <- function(i,k){
  if (i==0 || k==0){
  output <- 0
  } else if (length( w[i]) && w[i] > k) {
        output <- myfunction(i-1,w)
  } else {
        output <- max(v[i]+ myfunction(i-1, k-w[i]), myfunction(i-1,k))
      }
return(output)
}

现在你得到:

> myfunction(4,10)
[1] 90