如何在Python利用递归函数返回结果

  介绍

如何在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件装备时的攻击力。

如何在Python利用递归函数返回结果