列表理解返回n / 2的总和......?

时间:2013-05-10 12:12:16

标签: python range

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

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

print blah(32)

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

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

您需要生成一半的数字序列:

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))

答案 2 :(得分:1)

如果你真的想在那里找到某种列表理解,我会这样写:

import math

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