7
def problem(n):
myList = []
for j in range(0, n):
    number = 2 ** j
    myList.append(number)
return myList

我希望此代码根据 2 的前 n 个幂返回 2 的幂。例如,如果我输入 4,我希望它返回 [2,4,6,8,16]。现在,如果我输入 4,代码将返回 [1,2,4,8]。我认为是我的范围弄乱了代码。

4

5 回答 5

11

只需使用range(1,n+1)它就应该一切正常。 range对某些人来说有点混乱,因为它不包括端点。因此,range(3)返回列表[0,1,2]range(1,3)返回[1,2]


作为旁注,表单的简单循环:

out = []
for x in ...:
   out.append(...)

通常应替换为列表推导:

out = [ 2**j for j in range(1,n+1) ]
于 2012-11-13T02:13:18.287 回答
6

没有幂运算符的另一个简单有效的解决方案(O(1) 中的每一步):

def problem(n):
    return [1 << i for i in range(n)]

1 << i 操作是按位操作,对于 i 整数正数转换为 2 ^ i。

https://en.wikipedia.org/wiki/Arithmetic_shift

于 2017-01-04T11:42:32.553 回答
1

如果你想在 O(1) 中完成每一步:

def gen(x):
   i = 2
   for n in range(x + 1):
       yield i
       i <<= 1

>>> list(gen(4))
[2, 4, 8, 16, 32]

PS:问题中有一个错字,如果您想要 4 个数字gen(4),请range(x)改用

于 2012-11-13T02:20:00.713 回答
0

正如@JBernardo 指出的那样,我认为您的问题中有错字。

def squares(n):
    power = n
    square_list = []
    for i in range(1,n+1):
        square_list.append(2 ** i)
    return square_list


print squares(4)

将返回

[2,4,8,16]

于 2012-11-13T03:20:40.320 回答
0
import math
n = input()
a = [i for i in xrange(2, n+1) if (math.log(i)/math.log(2)).is_integer()]
print a
>>> [2, 4, 8, 16 ...]

返回小于或等于 n 的 2 的幂列表

解释:
一个数只能是 2 的幂,如果它的对数除以 2 的对数是一个整数。

例如。log(32) = log(2^5) = 5 * log(2)
5 * log(2) 除以 log(2) 得到 5,它是一个整数。

列表中还将有 floor(math.log(n, 2)) 元素,因为如果 n 本身不是 2 的幂,则这是 n 之下 2 的幂数的公式

于 2018-07-05T06:05:23.083 回答