免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5386 | 回复: 3
打印 上一主题 下一主题

请教,python返回多个值的问题 [复制链接]

论坛徽章:
8
双鱼座
日期:2014-07-30 09:28:14辰龙
日期:2014-08-22 14:14:43水瓶座
日期:2014-12-02 15:36:392015年亚洲杯之朝鲜
日期:2015-02-06 09:28:592015亚冠之全北现代
日期:2015-09-10 14:40:18青铜圣斗士
日期:2015-11-18 09:22:56黄金圣斗士
日期:2015-11-26 09:17:2615-16赛季CBA联赛之新疆
日期:2016-08-15 17:00:22
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2018-08-27 10:40 |只看该作者 |倒序浏览
本帖最后由 20032007 于 2018-08-27 11:11 编辑

自学Python编程导论,在背包问题这里学不下去了,遇到个问题,请教帮忙。
首先定义了一个类Item,这个类实际很简单,名字n,价值v,重量w,定义了gentName、getValue、getWeight三个函数返回n、v和w。

  1. class Item(object):
  2.     def __init__(self,n,v,w):
  3.         self.name=n
  4.         self.value=v
  5.         self.weight=w
  6.     def getName(self):
  7.         return self.name
  8.     def getValue(self):
  9.         return self.value
  10.     def getWeight(self):
  11.         return self.weight
  12.     def __str__(self):
  13.         result='<'+self.name+','+str(self.value)+','+str(self.weight)+'>'
  14.         return result
复制代码



然后写了一个函数,就能使用决策树来解决背包问题

  1. def maxVal(toConsider,avail):
  2.     """Assumes toConsider a list of items,avail a weight.
  3.     Returns a tuple of the total value of a solution to the
  4.     0/1 knapsack problem and the items of that solution"""

  5.     if toConsider == [] or avail == 0:
  6.         result=(0,())
  7.     elif toConsider[0].getWeight() > avail:
  8.     #Explore right branch only
  9.         result =maxVal(toConsider[1:],avail)
  10.     else:
  11.         nextItem=toConsider[0]
  12.         #Explore left branch
  13.         withVal,withToTake=maxVal(toConsider[1:],avail-nextItem.getWeight())
  14.         withVal+=nextItem.getValue()
  15.        #Explore right branch
  16.         withoutVal,withoutToTake=maxVal(toConsider[1:],avail)
  17.        #Choose better branch
  18.         if withVal>withoutVal:
  19.             result=(withVal,withToTake+(nextItem,))
  20.         else:
  21.            result=(withoutVal,withoutToTake)
  22.     return result
复制代码



我困惑不解的问题是,这个maxVal函数里,返回的是两个值,函数内部并没有明确指明第一个值是什么,第二个值是什么,但是返回的结果就是n和总的v。

  1. names=['a','b','c','d']
  2.     vals=[6,7,8,9]
  3.     weights=[3,3,2,5]
  4.     Items=[]
  5.     for i in range(len(vals)):
  6.         Items.append(Item(names[i],vals[i],weights[i]))
  7.         
  8.     val,taken = maxVal(Items,5)
  9.     for item in taken:
  10.         print(item)
  11.     print('Total value of items taken=',val)
复制代码
运行能得到正确结果,但是不明白为什么能得到结果。请教一下,应该怎么理解?
为啥maxVal函数就能向val和taken传递准确的结果?

论坛徽章:
0
2 [报告]
发表于 2018-08-30 16:25 |只看该作者
乱糟糟的看不下去

论坛徽章:
8
双鱼座
日期:2014-07-30 09:28:14辰龙
日期:2014-08-22 14:14:43水瓶座
日期:2014-12-02 15:36:392015年亚洲杯之朝鲜
日期:2015-02-06 09:28:592015亚冠之全北现代
日期:2015-09-10 14:40:18青铜圣斗士
日期:2015-11-18 09:22:56黄金圣斗士
日期:2015-11-26 09:17:2615-16赛季CBA联赛之新疆
日期:2016-08-15 17:00:22
3 [报告]
发表于 2018-09-04 09:34 |只看该作者
回复 2# dahe_1984

噢,可能是有点不吸引人注意。。。

论坛徽章:
0
4 [报告]
发表于 2018-09-29 10:51 |只看该作者
if withVal>withoutVal:
            result=(withVal,withToTake+(nextItem,))
        else:
           result=(withoutVal,withoutToTake)
maxVal函数返回的不就是这个吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP