我有,
def geometric(lst):
'checks whether the integers in list lst form a geometric sequence'
for i in range(1, len(lst) - 1):
if lst[i] * 2 == "don't know what to check here":
return True
else:
return False
我不知道如何应用它来检查是否所有指数。更喜欢在for循环中完成此操作。任何帮助将不胜感激!
答案 0 :(得分:4)
我认为这有效:
def geometric(lst):
for i in range(len(lst) - 2):
if lst[i] * lst[i + 2] != lst[i + 1] ** 2:
return False
return True
这是基于以下观点:对于任何三个连续项a, b, c
,前两个项之间的比率必须等于最后两个项之间的比率,即b/a = c/b
。重新排列这会给a * c == b ** 2
。使用没有除法的表单要好得多,因为除法引入了舍入错误。如果公共比率不是整数(例如[4, 6, 9]
),则此函数甚至可以工作。
修改
上述答案无法正确处理包含0
的列表。
正确的版本是:
def geometric(lst):
for i in range(len(lst) - 2):
if lst[i] * lst[i + 2] != lst[i + 1] ** 2:
return False
for i in range(len(lst) - 1):
if lst[i] == 0 and lst[i + 1] != 0:
return False
return True
这会为True
(公共比率[1, 0, 0]
)返回0
,但为False
返回[0, 0, 1]
。原始版本为两者返回True
。
禁止共同口粮0
可能更好。这意味着更改第二个循环以返回False
长度2
或更多包含0
的列表。
答案 1 :(得分:1)
正如sam2090指出的那样,第4行条件的右侧是空的。如果几何序列的公共比率为2(可能是您实际想要作为函数的参数传递的东西),那么表达式应为:
if lst[i] == lst[i-1] * 2
语句的左侧是指迭代(i)中的当前数字,而语句的右侧是指前一个数字(i-1)并将其值乘以2。 / p>
此外,在foor
循环中,请确保迭代到列表中的最后一个元素,因此您应该写:
for i in range(1, len(lst)):
而不是
for i in range(1, len(lst) - 1):