[英]Need help understanding recursion for python
我是递归的新手,想知道以下代码的逻辑是什么。
问题是关于hackerrank的powerSums问题: https ://www.hackerrank.com/challenges/the-power-sum/problem ? isFullScreen = true
def powerSum(X, N, current = 1):
pw = pow(current, N)
if pw > X:
return 0
elif pw == X:
return 1
else:
return powerSum(X, N, current+1) + powerSum(X-pw, N, current+1)
此外,我一直试图将答案转换为一组值的嵌套列表或元组,但似乎无法弄清楚。 如何才能做到这一点?
例如,对于 X=5 和 N=2 的情况,我想要产生的解决方案是:[(10), (6,8), (1,3,4,5,7)] 而不是 3,其中上面的代码正在产生。
您当前的代码正在返回解决方案的数量。 在两个基本情况之后,有两个递归调用。 在第一次递归调用中,我们正在检查X
存在多少解决方案而不包括current**N
。 如果我们确实包含current**N
则第二个递归检查测试存在多少解决方案。
如果您想返回实际的解决方案本身(作为元组列表),您需要稍微更改代码。
从基本案例开始。 如果pw > X
,没有current
这么大的解决方案,所以我们应该返回一个空列表。 如果pw == X
,那么我们已经找到了一个解决方案,并且应该返回一个单元素列表,其中包含单元素元组(current,)
(注意尾随逗号,这是使括号形成一个元组所必需的,而不是而不仅仅是为了操作顺序)。
递归情况也需要变得更复杂一些。 两个调用都将返回我们想要组合的列表。 对于第一次递归,我们可以直接使用返回的列表。 对于第二个,我们需要将current
值添加到每个元组的开头。 我建议使用生成器表达式(尽管如果您想使用+
而不是使用list.extend
连接列表,列表理解也可以工作)。
def powerSum(X, N, current = 1):
pw = pow(current, N)
if pw > X:
return []
elif pw == X:
return [(current,)]
else:
result = powerSum(X, N, current+1)
result.extend((current,) + tup for tup in powerSum(X-pw, N, current+1))
return result
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.