首页 > 解决方案 > Python中的虚拟数字生成器

问题描述

使用an = (an-2 + 1)×an-1witha0 = 0a1 = 1公式查找dummy_numbers(max)

我的代码:

def dummy_numbers(nums):
    binsize = (((nums - 2) +1) * (nums -1))
    return map(lambda x: int(nums + binsize * x), range(nums))

for num in dummy_numbers(10):
    print(num)

我的代码打印的结果与我预期的不同

标签: pythonpython-3.xgeneratordummy-data

解决方案


使用实际的生成yield器使这更容易。这里棘手的部分是跟踪an-1an-2迭代。这可以像这样实现:

second_last, last = None, None
for current in range(10):
    second_last, last = last, current
assert (second_last, last) == (8, 9)

您还需要在返回的常量值中硬编码0and 1

def dummy_numbers(an):
    if an == 0:
        yield 0
    elif an == 1:
        yield 0
        yield 1
    else:
        an_2, an_1 = None, None
        for an_0 in dummy_numbers(an - 1):
            an_2, an_1 = an_1, an_0
            yield an_0
        yield (an_2 + 1) * an_1


for num in dummy_numbers(10):
    print(num)

输出:

0
1
1
2
4
12
60
780
47580
37159980
1768109008380

您也可以像这样使这个非递归:

def dummy_numbers(an):
    an_2, an_1 = None, None
    for i in range(an):
        if i == 0:
            an_0 = 0
        elif i == 1:
            an_0 = 1
        else:
            an_0 = (an_2 + 1) * an_1

        yield an_0
        an_2, an_1 = an_1, an_0

推荐阅读