Python:无嵌套for循环生成双列表笛卡尔积及斐波那契项求和问题
嘿,这两个问题都挺实用的,我来给你详细讲讲怎么解决:
1. 无嵌套for循环生成笛卡尔积
要生成两个列表的笛卡尔积,最省心的方法就是用Python标准库的itertools.product——它专门用来处理这种可迭代对象的笛卡尔积场景,完全不用自己写嵌套循环:
import itertools a = [1, 2, 3] b = [4, 5, 6] c = list(itertools.product(a, b)) print(c) # 输出: [(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]
如果不想引入额外库,也可以用扁平列表推导式——虽然看起来有两个for,但它是顺序写法,不是嵌套缩进的循环结构,也符合你“不使用嵌套for循环”的要求:
a = [1, 2, 3] b = [4, 5, 6] c = [(x, y) for x in a for y in b] print(c) # 输出和上面完全一致
2. 计算所有斐波那契数列第n项的和
首先得搞清楚规律:每一对(x, y)作为前两项的斐波那契数列,第n项是有公式可循的,不用逐个数列去迭代计算到第n项(尤其是n很大时,这种方法效率极低)。
规律推导
设数列第k项为fib_k,则:
fib_1 = xfib_2 = yfib_3 = fib_1 + fib_2 = 1*x + 1*yfib_4 = fib_2 + fib_3 = 1*x + 2*yfib_5 = fib_3 + fib_4 = 2*x + 3*y- ...
- 通用公式:
fib_n = F(n-2)*x + F(n-1)*y,其中F是标准斐波那契数列(F(1)=1, F(2)=1, F(3)=2, F(4)=3, F(5)=5...)
基于这个公式,所有数列第n项的总和就可以拆解为:
总和 = F(n-2) * 所有x的和 + F(n-1) * 所有y的和
代码实现
先写一个高效的迭代版斐波那契函数(避免递归的性能问题):
def get_fib(k): if k == 1 or k == 2: return 1 prev, curr = 1, 1 for _ in range(3, k + 1): prev, curr = curr, prev + curr return curr
然后计算总和:
# 先拿到之前生成的笛卡尔积c a = [1, 2, 3] b = [4, 5, 6] c = list(itertools.product(a, b)) # 计算所有x的和与所有y的和 sum_x = sum(x for x, y in c) sum_y = sum(y for x, y in c) # 计算n=3时的总和 n = 3 coeff_x = get_fib(n - 2) # get_fib(1) = 1 coeff_y = get_fib(n - 1) # get_fib(2) = 1 total = coeff_x * sum_x + coeff_y * sum_y print(total) # 输出: 63,和示例完全匹配
如果n=4,按照这个方法计算:coeff_x = get_fib(2)=1,coeff_y=get_fib(3)=2,sum_x=18,sum_y=45,总和=118 +245=108,手动验证也完全正确。
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

