【问题标题】:List comprehension to return the sum of n/2...?列表推导返回 n/2 的总和...?
【发布时间】:2013-05-10 12:12:16
【问题描述】:

基本上,我如何在列表理解中编写相同的函数?

def blah(n):
    if n <= 1:
        return 1
    return n + blah(n/2)

print blah(32)

除了向自己证明列表理解中任何范围的自定义步骤实际上是可能的之外,我真的不需要这个。

【问题讨论】:

  • 这里没有列表。你能给我们一个for循环的例子吗?
  • 例如[blah(i) for i in range(32)]有什么问题?
  • blah() 是一个递归函数,您是否希望它展开?
  • 不清楚,您的问题含糊不清。
  • 有人会解决这个简单的重复并提供封闭形式的解决方案吗?

标签: python range


【解决方案1】:
import math
def lcsum(n):
    return sum([n>>i for i in range(int(math.log(n, 2))+1)])

【讨论】:

  • 你为什么要重新添加列表 comp?
  • 这个问题专门要求列表推导,直到列表非常大,列表推导将比等效的生成器表达式求和更快。由于列表的大小以 O(log(n)) 增长,因此生成器表达式版本比列表理解版本更快之前需要非常大的n
  • 好吧,只是因为问题说 to 不是必需的,但第二部分是有道理的
【解决方案2】:

您需要生成减半数的序列:

def halved(n):
    while n:
        yield n
        n >>= 1

然后用把它变成一个列表:

list(halved(32))

或者直接求和:

sum(halved(32))

您必须使用math.log() 将其转换为range()-合适的值:

import math
sum(n >> i for i in range(int(math.log(n, 2)) + 1))

【讨论】:

  • 我使用了无限循环
  • 那是因为我弄错了换档方向。再试一次。
  • 好的,工作。我无话可说,但stackoverflow迫使我写更多。
【解决方案3】:

如果你真的想要某种列表理解,我会这样写:

import math

def sumOfNHalf( n ):
   return sum( [ 2**x for x in range( 0, int( math.log( n, 2 ) + 1 ) ) ] )

【讨论】:

    猜你喜欢
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多