【问题标题】:Different results from for-loop and while-loop for prime factorization in Python 3Python 3中素数分解的for循环和while循环的不同结果
【发布时间】:2021-04-26 05:08:53
【问题描述】:

我编写了一个函数,它返回给定整数的质因子。对于我测试的案例,它似乎工作正常。这是原始函数。

def prime_factors_2(num: int) -> set:
    factors = []
    while num % 2 == 0:
        factors.append(2)
        num //= 2
    i = 3
    while i <= int(sqrt(num)) + 1:
        if num % i == 0:
            factors.append(i)
            num //= i
        else:
            i += 2
    if num != 1:
        factors.append(num)
    return set(factors)
    # num = 867844
    # Output = {601, 2, 19}

在弄乱代码的同时,我尝试实现相同的功能,但使用 for 循环而不是 while 循环(因为在涉及计数时我更喜欢使用 for 循环)。这是第二个函数的代码。

def prime_factors_1(num: int) -> set:
    factors = []
    while num % 2 == 0:
        factors.append(2)
        num //= 2
    for i in range(3, int(sqrt(num)) + 1, 2):
        if num % i == 0:
            factors.append(i)
            num //= i
            print(num)
    if num != 1:
        factors.append(num)
    return set(factors)
    # num = 867844
    # Output = {2, 19, 11419}

由于某种原因,它不再将 11419 分解为 601 和 19。这两个循环不相等吗?还是我在将 while 循环转换为 for 循环时犯了一些错误?我知道在这种情况下这两个循环之间没有实际区别,但出于好奇,我想知道这一点。

【问题讨论】:

    标签: python-3.x for-loop while-loop


    【解决方案1】:

    问题是,在“while 循环”中,只有在“if”条件不满足时,才会将“i”的值增加 2,但在“for 循环”的情况下,i 会增加每次迭代 2 个。

    所以如果你会做这样的事情:

    while i <= int(sqrt(num)) + 1:
        if num % i == 0:
            factors.append(i)
            num //= i
        i += 2
    

    那么 prime_factors_2 函数也会得出与 prime_factors_1 函数相同的答案

    【讨论】:

      【解决方案2】:

      这两个函数有细微的差别。

      如果您仔细观察 prime_factors_2,在 while 循环中,当满足 if 条件时,计数器不会增加。

      另一方面,在 prime_factors_1 中,在 for 循环中,无论 if 条件如何,计数器都会在每次迭代中递增。

      没有办法从 for 循环中控制计数器,所以 while 循环实现是唯一正确的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-12
        • 1970-01-01
        • 1970-01-01
        • 2022-06-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多