Py学习  »  Python

需要帮助理解python的递归

Rl1 • 5 年前 • 1551 次点击  

我是递归新手,想知道下面代码的逻辑是什么。

问题是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)]。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/49402
 
1551 次点击  
文章 [ 1 ]  |  最新文章 5 年前
Blckknght
Reply   •   1 楼
Blckknght    6 年前

您当前的代码正在返回解决方案的数目。在这两个基本情况之后,有两个递归调用。在第一个递归调用中,我们检查存在多少个解决方案。 X 不包括 current**N . 第二个递归检查如果我们存在多少解 包括 当前**N .

如果要返回实际的解决方案本身(作为元组列表),则需要稍微更改代码。

从基本情况开始。如果 pw > X ,没有解决方案 current 这么大,所以我们应该返回一个空列表。如果 pw == X ,然后我们找到了一个解决方案,应该返回一个单元素列表,其中包含单元素元组 (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