从传统循环到列表理解

2024-05-23 14:37:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个挑战,我想把我的代码(工作)转换成一个更有效的。给定一个数字prod(对于乘积),我们搜索两个Fibonacci数F(n)F(n+1),验证F(n) * F(n+1) = prod与否。你知道吗

这是我的原始代码

def productFib(prod):
    fibonacci_numbers = [0, 1]
    for i in range(2,prod+1):
        fibonacci_numbers.append(fibonacci_numbers[i-1]+fibonacci_numbers[i-2])

    pairing = [[fibonacci_numbers[i], fibonacci_numbers[i+1]] for i in range((len(fibonacci_numbers)-1))]
    for ind, pair in enumerate(pairing):
        if pair[0]*pair[1] ==prod:
            ans=[pair[0], pair[1], True]
            return ans
        elif all(pair[0]*pair[1] !=prod for pair in pairing)==True:
            match=next(x for x in pairing if x[0]*x[1]>prod)
            ans=[match[0], match[1], False]
            return ans
            break
def productFib(prod):

    fibonacci_numbers = [0, 1]
    for i in range(2, prod+1):
        fibonacci_numbers.append(fibonacci_numbers[i-1]+fibonacci_numbers[i-2])

    pairing = [[fibonacci_numbers[i], fibonacci_numbers[i+1], True] if [fibonacci_numbers[i]*fibonacci_numbers[i+1]]==prod \
    else [next(fibonacci_numbers[n] for n in range(len(fibonacci_numbers)-1) if fibonacci_numbers[n]*fibonacci_numbers[n+1]>prod), next(fibonacci_numbers[n+1] for n in range(len(fibonacci_numbers)-1) if fibonacci_numbers[n]*fibonacci_numbers[n+1]>prod) , False] if all(fibonacci_numbers[i]*fibonacci_numbers[i+1] !=prod) ==True \
    for i in range((len(fibonacci_numbers)-1))]

    return pairing

我希望它会回来:

[F(n), F(n+1), true] or [F(n), F(n+1), false]

根据一个数字prod(for product),我们搜索两个Fibonacci数字F(n)和F(n+1)验证->;F(n)*F(n+1)=prod


Tags: intrueforlenreturnifmatchrange
2条回答

我相信这个重做模仿了您的原始代码,但要简单得多:

def productFib(target):
    fibonacci = [0, 1]

    while True:
        product = fibonacci[0] * fibonacci[1]

        if product >= target:
            return fibonacci + [product == target]

        fibonacci[:] = fibonacci[1], sum(fibonacci)

print(productFib(272))
print(productFib(273))
print(productFib(274))

输出

> python3 test.py
[13, 21, False]
[13, 21, True]
[21, 34, False]
>

你暗示了两个目标:“更有效率”和“列表理解”,我用的是“更有效率”。你知道吗

通常,有一些方法可以简化问题:

  1. 另一种更简单更有效的方法
  2. 更具Python风格

F(n)*F(n+1)=prod,n的个数不超过一个。我认为你的想法是可以的,你可以产生你的fib列表,同时判断如果f(n)*f(n+1)=prob,也许你的代码可以更简单

prod = 50  # random value for your product
top_limit = int(prod ** 0.5)  # you should set a suitable top limit
def fib(top):
    n, a, b = 0, 0, 1
    while n < top:
        a, b = b, a + b
        if a * b == prod:
            yield [a,b,True]
        else:
            yield [a,b,False]
        n = n + 1
list(fib(top_limit))

输出为

[[1, 1, False],
 [1, 2, False],
 [2, 3, False],
 [3, 5, False],
 [5, 8, False],
 [8, 13, False],
 [13, 21, False]]

你看,13*21=273>;>;50,你可以把变量top_limit设置得更小

相关问题 更多 >