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
相关产品推荐
相关产品推荐

