我不熟悉递归,想知道以下代码的逻辑是什么。
问题是关于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。
答案 0 :(得分:0)
您当前的代码正在返回解决方案的数量。在这两种基本情况之后,有两个递归调用。在第一个递归调用中,我们要检查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