Python返回语句未运行

use*_*485 0 python

我正在创建一个程序来计算数字列表中最高的小数位数.基本上,一个列表[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:]) 
Run Code Online (Sandbox Code Playgroud)

现在,当我使用print(decimal)它的工作原理,但如果我更改print(decimal)到return decimal,它不返回任何东西.为什么是这样?我该如何解决?我遇到过这些返回语句,它们运行了很多次.提前致谢!

use*_*lpa 7

当你做一个递归调用(即当发生调用的地方,被叫的地方返回一个值,然后调用的地方必须返回它,以及(即返回值"冒泡"初始调用者).

所以你需要替换每个递归调用

place(...)
Run Code Online (Sandbox Code Playgroud)

同

return place(...)
Run Code Online (Sandbox Code Playgroud)

正如其他人所说,有更简单的解决方案,例如使用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:])
Run Code Online (Sandbox Code Playgroud)

尽管这是尾递归的,但Python并不关心,因此这种方法效率低下.使用max()或使用循环将是Python中更好的解决方案.