我在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的值,但整个功能都输入了。
这些是值
答案 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