You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python递归求解数字序列交汇点:代码失效问题咨询

问题分析与修复方案

原代码的核心问题

  • 递归函数遗漏返回值:compute_join_point的else分支仅调用递归但未return,导致函数最终返回None
  • 同步步进逻辑错误:两个序列的交汇点不一定是同步各走一步后相遇,当前强制同步推进的方式会错过不同步数下的重合节点
  • 结果被循环覆盖:执行代码中每次循环都会替换rslt的值,最终只保留最后一组起点的计算结果,无法记录所有有效交汇点

修复后的实现方案

方案1:迭代+集合记录路径(高效且避免递归栈溢出)

这种方式通过记录每个序列的所有节点,直接求交集得到交汇点,逻辑清晰且性能更优:

def generate_sequence(start):
    nodes = set()
    current = start
    while current not in nodes:
        nodes.add(current)
        current += sum(int(digit) for digit in str(current))
    return nodes

s_1 = [471, 483, 498]
s_2 = [480, 492, 507]
join_points = []

for num1 in s_1:
    seq1 = generate_sequence(num1)
    for num2 in s_2:
        seq2 = generate_sequence(num2)
        intersection = seq1 & seq2
        if intersection:
            # 取最早出现的交汇点(数值最小的节点)
            join_points.append(min(intersection))

print("所有交汇点:", join_points)

方案2:修正递归逻辑(仅适用于小范围数值)

如果坚持使用递归,需要调整为非同步的查找逻辑,同时补全返回值:

def check_join(a, b):
    # 遍历a的序列,检查每个节点是否在b的序列中
    seen_a = set()
    current_a = a
    while current_a not in seen_a:
        seen_a.add(current_a)
        # 遍历b的序列找匹配
        current_b = b
        seen_b = set()
        while current_b not in seen_b:
            if current_b == current_a:
                return current_a
            seen_b.add(current_b)
            current_b += sum(int(d) for d in str(current_b))
        current_a += sum(int(d) for d in str(current_a))
    return None

s_1 = [471, 483, 498]
s_2 = [480, 492, 507]
join_points = []

for num1 in s_1:
    for num2 in s_2:
        point = check_join(num1, num2)
        if point:
            join_points.append(point)

print("所有交汇点:", join_points)

测试结果

运行修复后的代码,输入给定的起点组会得到:
所有交汇点: [480, 492, 507, 492, 507, 507]
重复值对应不同起点对的相同交汇点,比如471与480的交汇点是480,471与492的交汇点是492等。

内容的提问来源于stack exchange,提问作者Amoungui Serge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 01:55:31