首页 > 解决方案 > 有没有更简单的方法可以从三组数字中找到等差数列?

问题描述

我有三组数字,目标是从中找到尽可能多的构成等差数列的集合。我知道一组对应于每个序列的第一个数字,依此类推。使用这些(缩短的)列表版本,找到序列的方法是什么?到目前为止,我唯一的想法是嵌套 for 循环,它适用于较小的列表,但对于完整的列表开始花费太长时间。

clist = [7, 11, 52, 102, 144, 314]
tlist = [10, 29, 79, 94, 121, 146]
flist = [13, 47, 184, 190, 544, 649]

提前感谢您的帮助

标签: pythonsequence

解决方案


所以首先你想要一个空集,每一个只有一个元素的集合,每一个只有两个元素的集合,因为从技术上讲,所有这些都可以说是一个算术级数:

series = [[]]

for j in range(len(clist)):

    series.append([clist[j]])
    series.append([tlist[j]])
    series.append([flist[j]])

    for k in range(len(clist)):
        series.append([clist[j],tlist[k]])
        series.append([clist[j],flist[k]])
        series.append([flist[j],tlist[k]])
        series.append([flist[j],clist[k]])
        series.append([tlist[j],clist[k]])
        series.append([tlist[j],flist[k]])
        if j != k:
                 series.append([tlist[j],tlist[k]])  
                 series.append([clist[j],clist[k]])
                 series.append([flist[j],flist[k]])

我排除了 j = k 的情况,因为否则存在无限多个解决方案,其中每个元素相同且特征差异为 0(例如 [13]、[13,13,13,13,13,13]、[13、 13,13,13,13,13,13,13,13,13] ...)

因此,“系列”现在包括您可以从这些长度为 0、1 或 2 的列表中创建的每个算术序列。下一步是检查每个 2 长度算术序列中每个元素之间的差异,并编写代码再次检查一个数字是那个差异。例如,列表 [7, 10] 的差值为 3,因此下一个可以组成列表的元素是“13”。我们可以编写代码,首先检查当前系列中的所有列表,然后检查任何列表中是否有一个数字,该数字是系列的特征差异大于最后一个元素,如果有,则附加一个新列表 (这是旧列表加上新元素)到系列列表。

这个问题听起来含糊不清,所以我不会为你做,但希望我的评论清楚你应该做什么。


推荐阅读