Python 使用递归返回列表中不包括K和以下数字的和
我的代码应该接收一个整数和一组整数。它回来了 列表中整数的总和,但忽略 不吉利的数字和紧跟其后的数字 不幸的数字。我只是尝试使用递归(没有迭代)。到目前为止,我的代码适用于前5种情况,但与后2种情况有问题,因为它们的末尾有不吉利的数字。我没有试图完全重写我的函数,只是在我当前的函数中发现了错误Python 使用递归返回列表中不包括K和以下数字的和,python,list,recursion,list-comprehension,Python,List,Recursion,List Comprehension,我的代码应该接收一个整数和一组整数。它回来了 列表中整数的总和,但忽略 不吉利的数字和紧跟其后的数字 不幸的数字。我只是尝试使用递归(没有迭代)。到目前为止,我的代码适用于前5种情况,但与后2种情况有问题,因为它们的末尾有不吉利的数字。我没有试图完全重写我的函数,只是在我当前的函数中发现了错误 def unlucky(unlucky_num, a_list): """ >>> unlucky(13,[1]) 1 >>> unlu
def unlucky(unlucky_num, a_list):
"""
>>> unlucky(13,[1])
1
>>> unlucky(13,[1,2,3,4,5,6])
21
>>> unlucky(13,[13,1,2,3])
5
>>> unlucky(13,[1,13,2,3])
4
>>> unlucky(13,[13, 0])
0
>>> unlucky(13,[13,1,2,13,2,1,13]) #13,1,13,2,13 ignored
3
>>> unlucky(7,[7,4,5,7,5,4,7]) #7,4,7,5,7 ignored (7 is unlucky)
9
"""
if a_list == []:
return 0
if a_list[0] == unlucky_num:
if len(a_list) > 1:
return unlucky(unlucky_num, a_list[2:])
return unlucky(unlucky_num, a_list)
return a_list[0] + unlucky(unlucky_num, a_list[1:])
对于最后两种情况,我收到以下错误(文件名已编辑):
错误
**********************************************************************
文件“----”,第39行,用sum_表示不吉利
失败示例:
sum#u不幸(13,[13,1,2,13,2,1,13])#13,1,13,2,13被忽略
提出的例外情况:
回溯(最近一次呼叫最后一次):
文件“-----”,第138行,处于运行状态
exec(compile)(example.source,文件名,“single”,
文件“”,第1行,在
sum#u不幸(13,[13,1,2,13,2,1,13])#13,1,13,2,13被忽略
文件“-----”,第50行,sum_不幸
返回sum_unlucky(unlucky_num,a_列表[2:])
文件“-----------”,第52行,不吉利
返回一个_列表[0]+sum_unlucky(unlucky_num,a_列表[1:])
文件“----------”,第50行,总计
返回sum_unlucky(unlucky_num,a_列表[2:])
文件“----------”,第52行,不吉利
返回一个_列表[0]+sum_unlucky(unlucky_num,a_列表[1:])
文件“-----”,第51行,sum_不幸
返回和不吉利(不吉利的数字,一个列表)
文件“----”,第51行,用sum_表示不吉利
返回和不吉利(不吉利的数字,一个列表)
文件“----”,第51行,用sum_表示不吉利
返回和不吉利(不吉利的数字,一个列表)
[上一行重复986次以上]
文件“---”,第45行,用sum\u表示不吉利
如果一个_列表==[]:
RecursionError:比较中超出了最大递归深度
正如Mark Meyer所说,它永远不会到达列表=[]
。尝试:
def unlucky(unlucky_num,一个列表):
如果len(a_列表)==1:
如果一个_列表[0]==不走运的_num:
返回0
其他:
返回一个_列表[0]
如果一个_列表[0]==不走运的_num:
如果len(a_列表)>1:
返回unlucky(unlucky_num,a_列表[2:])
返回不吉利(不吉利的数值,一个列表)
返回一个\u列表[0]+不吉利(不吉利的\u num,一个\u列表[1:])
如果len(a_列表)==1,您忘记排除不吉利的数字。请使用a_列表[1:][/code>
def unlucky(unlucky_num, a_list):
if a_list == []:
return 0
if a_list[0] == unlucky_num:
if len(a_list) > 1:
return unlucky(unlucky_num, a_list[2:])
return unlucky(unlucky_num, a_list[1:]) # <- Here
return a_list[0] + unlucky(unlucky_num, a_list[1:])
实际上,您只需要两个测试,这将更容易避免错误。一个测试基本情况,即空数组和一个测试不吉利的数字。您不需要测试基本情况后的长度,因为您可以传回空数组。通过这两个测试,函数的编写方式可以非常准确地反映需求可读方式:
def unlucky(unlucky_num, a_list):
if not a_list: # base case
return 0
head, *rest = a_list # rest will be [] when len(a_list) == 1
if head == unlucky_num:
return unlucky(unlucky_num, rest[1:])
return head + unlucky(unlucky_num,rest)
unlucky(7,[7,4,5,7,5,4,7])
# 9
你得到了什么结果?把它放在问题中很有帮助,这样我们可以更容易地看到问题。如果不清楚,我很抱歉。我用红色突出显示的doctest来演示示例输出。但是会包括错误。没问题,这只会有助于提前获得所有信息。很清楚你期望的是什么,但有助于显示您实际得到的结果。如果某个列表[0]==unlucky\u num
您没有提供else to,因此当列表中的最后一个数字是不吉利的数字时,它不会停止。它会不断返回return a\u list[0]+unlucky(unlucky\u num,a\u list[1:])
这似乎有效,但它会在案例中产生另一个错误>>不幸(13[13,0])
请检查!它比我的更清楚!
def unlucky(unlucky_num, a_list):
if a_list in ([], [unlucky_num]):
return 0
elif a_list[0] == unlucky_num:
return unlucky(unlucky_num, a_list[2:])
return a_list[0] + unlucky(unlucky_num, a_list[1:])
def unlucky(unlucky_num, a_list):
if not a_list: # base case
return 0
head, *rest = a_list # rest will be [] when len(a_list) == 1
if head == unlucky_num:
return unlucky(unlucky_num, rest[1:])
return head + unlucky(unlucky_num,rest)
unlucky(7,[7,4,5,7,5,4,7])
# 9