def largestNumber(numberList):
if len(numberList) == 1:
return numberList[0]
else:
largestNumber(numberList[1:])
对于这段代码,我传入一个列表[1,2,3,4,5,6,7,8,9,10]
,函数返回None
...但我希望它在调用自己直到它返回1
之前。有人可以帮忙解释一下吗?
答案 0 :(得分:3)
删除每个递归调用中的最后一个元素,不要忘记返回递归:
def largestNumber(numberList):
if len(numberList) == 1:
return numberList[0]
else:
numberList = numberList[:-1]
return largestNumber(numberList)
ls = [1,2,3,4,5,6,7,8,9,10]
print(largestNumber(ls))
print(ls)
=> 1
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
答案 1 :(得分:1)
在这个问题和接受的答案中似乎都出现了问题。我将尝试弄清楚它。没有人会写一个递归函数只是为了找到列表的第一个或最后一个元素,当然不会命名该函数largestNumber()
。
让我们假设原始问题规范是这样的:
不使用
max()
,编写一个模拟max()
的递归函数 通过查找数字列表中的最大数字。称为largestNumber()
,它需要一个列表并返回一个数字。
一旦添加了缺失的return
,OP代码的剩余问题以及当前接受的答案的问题就是它们丢弃了列表的元素并简单地返回递归的基本情况。他们从不将列表的当前(第一个)元素与递归结果进行比较以确定最大数字:
def largestNumber(numberList):
a, *rest = numberList
if not rest:
return a
b = largestNumber(rest)
return a if a > b else b
if __name__ == "__main__":
import random
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
random.shuffle(my_list)
print(my_list, '->', largestNumber(my_list))
<强> TEST 强>
> python3 test.py
[2, 4, 6, 3, 5, 7, 8, 1, 9, 10] -> 10
> python3 test.py
[6, 4, 9, 1, 10, 7, 5, 3, 8, 2] -> 10
> python3 test.py
[10, 8, 7, 3, 2, 9, 1, 6, 4, 5] -> 10