gpt4 book ai didi

r - 具有递归函数的 R 中的 KnapSack 动态规划

转载 作者:行者123 更新时间:2023-12-05 00:17:30 24 4
gpt4 key购买 nike

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

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)
}

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

我没有得到 90 的值,但是整个函数都打出来了。

enter image description here

这些是值(value)观

最佳答案

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

> 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 ,因此在首先测试该可能性的条件中添加一个逻辑子句并使用正确的“双与符号”( && ):
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

关于r - 具有递归函数的 R 中的 KnapSack 动态规划,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40222529/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com