python3 递归函数return返回None

点点圈 提交于 2019-12-01 09:12:17
今天写了一个函数,执行之后打印出来的结果是None,不明白,之后百度了一下,这里记一下过程,免得之后再踩坑
#!/usr/bin/python3# -*- coding:utf-8 -*-def binarysystem_to_decimalsystem():    '''实现二进制转十进制'''    binarysystem = input('请输入数据:')    decimalsystem_sum = 0    try:        binarysystem = float(binarysystem)    except ValueError:        print('输入错误,请重新输入')        binarysystem_to_decimalsystem()    else:        binarysystem = str(binarysystem)        if len(binarysystem.replace('1', '').replace('0', '').replace('.', '')) == 0:            binarysystem = binarysystem.split('.')            binarysystem_int = binarysystem[0]  # 整数部分            binarysystem_int = binarysystem_int[::-1]            binarysystem_float = binarysystem[1]  # 小数部分            for i, index in zip(binarysystem_int, range(0, len(binarysystem_int))):                decimalsystem_sum = int(i) * 2 ** index + decimalsystem_sum            for j, secondar in zip(binarysystem_float, range(1, len(binarysystem_float) + 1)):                decimalsystem_sum = int(j) * 2 ** (-1 * secondar) + decimalsystem_sum            return decimalsystem_sum        else:            print('输入错误,请重新输入')            binarysystem_to_decimalsystem()if __name__ == '__main__':    print(binarysystem_to_decimalsystem())
上面是刚写完的代码,按照想法,应该会输出正确的值,结果却输出了None按照函数的定义,在没有返回值或是return语句没有接收到返回值的时候,才会出现None之后debug了一下,发现函数在执行之后得到了正确的结果,但是却没有直接结束,而是回到了判断分支的地方之后在网上百度了一下,也看了一些文章,了解到这是递归函数的一个坑,当同时使用判断语句、递归函数、return语句的时候,这个坑就会出现比如下面这个函数
def test_recursion(x):    if x > 9:        x -= 3        test_recursion(x)    else:        return xprint(test_recursion(20))这个执行出来的结果也是None,改用print打印的写法,结果就是正确的
def test_recursion(x):    if x > 9:        x -= 3        return test_recursion(x)    else:        print(x)test_recursion(20)
要使用递归函数,return语句的正确的写法是下面这个
def test_recursion(x):    if x > 9:        x -= 3        return test_recursion(x)    else:        return xprint(test_recursion(20))这里面的逻辑是这样:这个函数被重复调用了4次,在最后一次调用的时候得到了正确结果,然后回到了倒数第二次调用的地方,之后倒数第三。。。。。。。也即是说,第一种写法,因为递归的时候缺少了return语句,返回的结果是第一次被调用的结果,不是最后一次的正确结果第二种写法,加上了return语句,返回的是最后一次的结果,逻辑是最后一次的结果用return语句给了倒数第二次调用,倒数第二又给了倒数第三。。。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!