需要帮助了解python的递归

时间:2018-12-31 01:09:31

标签: python recursion

我不熟悉递归,想知道以下代码的逻辑是什么。

问题是关于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。

1 个答案:

答案 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