python - 去元组替代
问题描述
我正在学习麻省理工学院计算思维和数据科学导论课程第 2课讲座 PDF,我正在尝试将以下树搜索算法 python 代码翻译成 Golang。主要问题是python代码使用了一个元组。
def maxVal(toConsider, avail):
"""Assumes toConsider a list of items, avail a weight
Returns a tuple of the total value of a solution to the
0/1 knapsack problem and the items of that solution"""
if toConsider == [] or avail == 0:
result = (0, ())
elif toConsider[0].getCost() > avail:
#Explore right branch only
result = maxVal(toConsider[1:], avail)
else:
nextItem = toConsider[0]
#Explore left branch
withVal, withToTake = maxVal(toConsider[1:],
avail - nextItem.getCost())
withVal += nextItem.getValue()
#Explore right branch
withoutVal, withoutToTake = maxVal(toConsider[1:], avail)
#Choose better branch
if withVal > withoutVal:
result = (withVal, withToTake + (nextItem,))
else:
result = (withoutVal, withoutToTake)
return result
def testMaxVal(foods, maxUnits, printItems = True):
print('Use search tree to allocate', maxUnits,
'calories')
val, taken = maxVal(foods, maxUnits)
print('Total value of items taken =', val)
if printItems:
for item in taken:
print(' ', item)
我知道 Go 没有元组,我四处寻找解决方法。我尝试了这个解决方案但没有运气:
type Food struct {
name string
value int
calories int
}
type Pair struct{ //found this work around on another stack overflow question but I think I incorrectly implemented it
a,b interface{}
}
func maxVal(toConsider []Food, avail int) Pair{
/*
Assumes toConsider a list of items, avail a weight
Returns a tuple of the total value of a solution to the
0/1 knapsack problem and the items of that solution
*/
var result Pair //the culprit
if (toConsider == nil || avail == 0){ //Slices can only be compared to nil so I am not sure this is achieving what I want it to achieve (i.e. checking for an empty list)
result = Pair{0, nil}
} else if toConsider[0].calories > avail{
//explore right branch only
result = maxVal(toConsider[1:], avail)
} else{
nextItem := toConsider[0]
//explore left branch
withVal, withToTake := maxVal(toConsider[1:], avail - nextItem.calories)
withVal = withVal + nextItem.value
//explore right branch
withoutVal, withoutToTake := maxVal(toConsider[1:], avail)
//choose better branch
if withVal > withoutVal{
result = Pair{withVal, withToTake + (nextItem)}
}
}
return result
}
func testMaxVal(foods []Food, maxUnits int, printItems bool) {
printItems = true
fmt.Printf("Use search tree to allocate %d calories", maxUnits)
val, taken := maxVal(foods, maxUnits)
fmt.Printf("\nTotal value of items taken = %d", val)
if printItems{
for i := range taken{
fmt.Print("\n ", i)
}
}
}
解决方案
Go 没有元组,但它可以返回多个值:
func maxval(toConsider []Food, avail int) (int,[]Food) {
if len(toConsider)==0 || avail == 0) { // len(toConsider)==0 will work even if toConsider is nil
return 0,nil
}
...
}
推荐阅读
- javascript - 无法在 javascript 循环中从数据库中获取数据
- c++ - C ++将所有文件从一个目录移动到另一个目录
- java - 我无法让图像加载到小程序上
- groovy - 在 Katalon Studio 中执行 Junit 测试时出现内部错误
- c# - Response.Redirect() 在 Response.Flush() 之后;
- java - 使用套接字时,json文件未完成
- python - 如何从图像中裁剪边界框
- python - 使用 pandas 聚合表
- ios - Xcode 存档错误:命令操作工具失败,退出代码为 255
- mariadb - Mariadb 10.3 如何导出/导入序列