如何在Python利用递归函数返回结果?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
递归(递归)是一种神奇的编程技巧,可以大幅简化代码,使之看起来更加简洁。然而递归设计却非常抽象,不容易掌握。通常,我们都是自上而下的思考问题,递归则是自下而上的解决问题,这就是递归看起来不够直观的原因。
和递归相关的概念里,线性递归/非线性递归,单向递归/非单向递归,是非常重要的,要想掌握递归技术,就必须要深入理解。关于递归的基本概念,有兴趣的读者,可以参考我的博客《Python递归算法指归》。今天,仅就背包问题谈非单向递归函数如何返回全部结果。
背包问题的背后,是世界七大数学难题之一,多项式复杂程度的非确定性问题。作为程序员,可以将该问题大致上理解为组合优化的问题。背包问题通常被这样描述:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,如何选择,才能使得物品的总价格最高。如果加上不同的限制和条件,背包问题可以衍生出很多变种。比如,下面这道题看起来和背包问题相去甚远,实质上仍然是一个典型的背包问题。
在一款英雄对战游戏中,玩家拥有m件装备和n位英雄,他可以给每一位英雄分配0件或多件装备,而不同的英雄拥有不同数目的装备时将获得不同的攻击力。玩家如何分配这m件装备,可以使得n个英雄获得的攻击力的和最大?以玩家拥有5件装备和3位英雄为例,下表共有3行6列,对应着3位英雄分别拥有从0到5件装备时的攻击力。
0件1件2件3件4件5件英雄1013579英雄2011337英雄3034567
即使不熟悉背包问题,也不难找到解题思路:
- <李>
找出所有可能的装备分配方案
李> <李>计算每一个方案的攻击值
李> <李>选择攻击值最大的分配方案
李> 1。找出所有可能的装备分配方案
找出将m件装备分配给n位英雄的所有方案是解决问题的核心。这里,循环嵌套是行不通的,因为嵌套层数是输入变量。递归是我想到的可行的方法。
在祝辞祝辞,def 袋(m, n,系列=列表()): ,,,if n ==, 1: ,,,,,for 小姐:拷贝范围(m + 1): ,,,,,,,印刷(系列+[我]) ,,,: ,,,,,for 小姐:拷贝范围(m + 1): ,,,,,,,包(m, n - 1,系列+[我]) ,, 在祝辞祝辞,袋(3 2),#,将3件装备分配给2位英雄的全部方案 (0,0) [0,1] (0,2) (0,,3) (1,0) (1,1) [1,2] (2,,0) (2,1) [3,,0]
递归函数包,打印出了将3件装备分配给2位英雄的全部方案。显然,这不是一个单向递归,因为在同一级有多次递归调用,这意味着递归过程有多次从递归出口走出。对于非单向递归,是不能使用返回返回结果的。那么,如何让递归函数返回全部方案呢?请看下面的例子。
在祝辞祝辞,def 袋(m, n,,结果,,系列=列表()): ,if n ==, 1: ,for 小姐:拷贝范围(m + 1): result.append才能(系列+[我]) #才能打印(结果[1]) ,其他的: ,for 小姐:拷贝范围(m + 1): 包才能(m i, n - 1,,结果,,系列+[我]) ,, 在祝辞祝辞,result =,列表() 在祝辞祝辞,袋(5,,3,,结果),#,将5件装备分配给3位英雄,共有56种分配方案 在祝辞祝辞,len(结果) 56 在祝辞祝辞,结果 [[0,0,0),,(0,0,1],,(0,0,2],,(0,0,3],,(0,0,4],,(0,0,5],, [0,1,0],,(0,1,1),,(0,1,2),,[0,,1,,3],,(0,1,4],,[0,,2,,0),, [0,,2,,1],,[0,,2,,2),,[0,,2,,3],,[0,,3,,0),,[0,,3,,1],,[0,,3,,2),, [0,,4,,0],,[0,,4,,1],,[0,,5日,0],,(1,0,0),,(1,0,1],,(0,1,,2,, (0,1,,3],,(1,,0,,4],,(1,,1,,0],,(1,1,1),,(1,,1,,2],,(1,1,3),, [1,,2,,0],,(1,,2,,1],,(1,,2,,2],,(1,,3,,0],,(1,,3,,1],,(1,4,,0),, [2,0,0),,(2,0,1],,(2),0,,2],,(0,2,,3],,(2,1,0],,(2,1,1),, [2,,1,,2],,(2,,2,,0],,(2,,2,,1],,(2,,3,,0],,[3,0,0),,[3,0,1],, [3,,0,,2],,[3,,1,,0),,[3,,1,,1],,[3,,2,,0),,[4,0,0),,[4,0,1],, [4,,1,,0],,[5,0,0)]
上面的代码中,在调用递归函数之前,先创建一个全局的列表对象的结果,并作为参数传递给递归函数。递归调用结束后,全部的装备分配方案就保存在列表对象结果中。
2。计算每一个方案的攻击值
遍历56种分配方案,计算每一种方案的攻击力之和,保存到一个新的列表v中每分钟为3位英雄分别拥有从0到5件装备时的攻击力。