Python递归计算元组非负数平方和时遇索引越界问题求助
递归计算列表元组中非负数平方和的索引越界问题修复
我需要用Python递归方法计算列表内各元组的非负数平方和,列表元素是形如(数量, (字符串数字元组))的结构,第一个元素是对应元组的元素个数。我写了两个递归函数:iterate计算单个元组内非负数的平方和,iterateList遍历列表并调用iterate,最终返回结果列表。但运行时一直报index out of range错误,排查发现疑似出现在处理第二个元组(2, ('2','4'))时,找不到具体原因和修复方法。
原代码:
def iterate(lst, start, end): if start >= end: return 0 else: if (int (lst[start])) < 0: return iterate(lst, start+1, end) else: return (int(lst[start]))**2 + iterate(lst, start+1, end) def iterateList(lst, start, end): if start >= end: return else: print("value of start:", start) print(lst[start]) print(lst[start][1]) return [iterate(lst[start][1], 0, lst[start][0])] + iterateList(lst[start+1][1], 0, lst[start+1][0]) lst1 = [(3, ('-5', '-4', '4')), (2, ('2', '4')), (3, ('-6', '4', '3'))]
错误原因分析
- 递归参数传递错误:
iterateList递归调用时,错误地将lst[start+1][1](单个数字字符串元组)作为新的lst传入,而非原列表。后续递归时,代码试图访问这个字符串元组的[start][1],但元组内元素是字符串,没有二级索引,直接触发索引越界。 - 终止条件返回值错误:当
start >= end时,iterateList返回None,列表与None拼接会触发类型错误,同时导致递归链中断时的结构异常。
修复后的代码
def iterate(lst, start, end): if start >= end: return 0 num = int(lst[start]) if num < 0: return iterate(lst, start + 1, end) else: return num ** 2 + iterate(lst, start + 1, end) def iterateList(lst, start, end): if start >= end: return [] # 返回空列表,保证列表拼接正常执行 current_sum = iterate(lst[start][1], 0, lst[start][0]) # 递归时传入原列表,仅递增start索引 return [current_sum] + iterateList(lst, start + 1, end) lst1 = [(3, ('-5', '-4', '4')), (2, ('2', '4')), (3, ('-6', '4', '3'))] # 正确调用并输出结果 result = iterateList(lst1, 0, len(lst1)) print(result) # 输出: [16, 20, 25]
修复说明
iterateList递归时保持传入原列表lst,仅将start加1,确保每次处理的都是原列表中的完整元组元素。- 终止条件返回空列表
[],递归到末尾时列表拼接操作可正常完成,避免类型错误。 - 优化
iterate函数的变量提取,让代码更简洁易读。
内容的提问来源于stack exchange,提问作者hodondo
相关产品推荐
相关产品推荐

