为什么python函数使用相同的参数返回不同的结果?

时间:2018-09-26 11:40:42

标签: python

def dbl_linear(n):

    integers = [1]
    for k in range(71100):
        integers.extend([integers[k]*2+1, integers[k] * 3 + 1])
    a = list(set(integers))
    a.sort()
    return a[n]

我在代码战中找到了这项任务,但无法解决 我的函数返回不同的结果这取决于范围内的数字 如果我在范围60001中写入并返回list [60000],并且如果我在范围100000中写入并返回list [60000],则它们是不同的 为什么?

1 个答案:

答案 0 :(得分:0)

您生成的数字不是严格排序的。每增加k,列表中就会增加两个个整数,这些整数不一定大于之前添加的数字。

您已经在k = 2上看到了这一点:

  • 对于k = 0integers[0]1,因此循环将添加1 * 2 + 11 * 3 + 1 == 3, 4
  • k = 1采用integers[1] == 3,因此将7, 10添加到列表中。
  • k = 2采用integers[2] == 4,因此将9, 13添加到列表中。 910

随着您反复添加更多值,此操作将继续。对于10001次重复,循环显然会添加至少一个值,该值小于您仅重复60000次循环时被排序到索引60001的值

实际上有3001个这样的值:

>>> upto60k = [1]
>>> for k in range(60001):
...     upto60k += upto60k[k] * 2 + 1, upto60k[k] * 3 + 1
...
>>> upto100k = [1]
>>> for k in range(100001):
...     upto100k += upto100k[k] * 2 + 1, upto100k[k] * 3 + 1
...
>>> added = sorted(set(upto100k).difference(upto60k))
>>> len(added)
68046
>>> sorted(set(upto60k))[60000]
1726840
>>> from bisect import bisect_left
>>> bisect_left(added, 1726840)  # index of first value > 1726840
3001

因此,较长循环中添加到integers的额外值中的3001小于1726840,并将在该值之前排序;因此您会在索引63001的10万次重复设置中找到相同的1726840值:

>>> sorted(set(upto100k))[63001]
1726840