我正在创建一个程序来计算数字列表中最高的小数位数。基本上,[123, 1233]
的列表将返回4,因为1233中有四个数字,它是最大的。另一个例子是[12, 4333, 5, 555555]
将返回6,因为555555有6个数字。
这是我的代码。
def place(listy):
if len(listy) == 1:
decimal = len(str(listy[0]))
print(decimal)
else:
if len(str(listy[0])) >= len(str(listy[1])):
new_list = listy[0:1]
for i in listy[2:]:
new_list.append(i)
place(new_list)
else:
place(listy[1:])
现在,当我使用print(decimal)
时,它会起作用,但如果我将print(decimal)
更改为return decimal
,则不会返回任何内容。为什么是这样?我该如何解决?我遇到过这些返回语句,它们运行了很多次。提前谢谢!
答案 0 :(得分:7)
当你进行递归调用时(即当放置调用 place ,并且被调用的 place 返回一个值时,则调用 > place 也必须返回它(即返回值“冒泡”到初始调用者)。
所以你需要替换每个递归调用
place(...)
带
return place(...)
正如其他人所说,有更简单的解决方案,例如使用max()。如果你想保持递归方法,我会按如下方式重构你的代码:
def place2(listy):
if len(listy) < 1:
return None
elif len(listy) == 1:
return len(str(listy[0]))
else:
v0, v1 = listy[0], listy[1]
if v1 > v0:
return place2(listy[1:])
else:
return place2([listy[0]]+listy[2:])
虽然这是尾递归的,但Python并不关心,所以这种方法效率低下。使用max()或使用循环将是Python中更好的解决方案。
答案 1 :(得分:1)
并不是return
没有做任何事情,而是你不会传播递归调用的回报。您需要更多回报:
def place(listy):
if len(listy) == 1:
decimal = len(str(listy[0]))
return decimal
else:
if len(str(listy[0])) >= len(str(listy[1])):
new_list = listy[0:1]
for i in listy[2:]:
new_list.append(i)
return place(new_list) # <-- return added
else:
return place(listy[1:]) # <-- return added
您可以在任何级别查看打印,但要将其恢复到调用者,则需要传播它。
答案 2 :(得分:0)
如果你想要的只是找到整数列表的最大长度,请考虑:
max([len(str(n)) for n in N])
例如
N = [1,22,333,4444]
max([len(str(n)) for n in N]) # Returns 4
N = [12, 4333, 5, 555555]
max([len(str(n)) for n in N]) # Returns 6
注意:这仅适用于正整数。
或更简单:
len(str(max(N)))
这也适用于正整数。
答案 3 :(得分:0)
该函数会返回值,但不会将其打印出来。
解决此问题的一种简单方法是,只需在print语句中调用该函数即可。
即是
print(place(listy))
答案 4 :(得分:-2)
使用&#39;&#39;全局变量&#39;&#39; (谷歌)访问和更改在您的函数之外定义的变量。