在做一道练习题(参照下篇博文《在当前目录下递归的查找包含指定字符串的文件》)的时候,发现函数中的return的值竟然是None,百思不得其解,尝试化繁为简,用以下的简单的代码验证了一下

问题版本代码:为什么return i 返回的是 i , 而print(i)得到的是 0

def func(i):
    if i == 0:
        print(i)
        return i
    elif i > -2:
        i = i-1
        func(i)

print(func(3))

运行结果:
0
None

如果把递归过程画成流程图,或许更容易理解一些

case1: 有递归的情况

case2: 无递归的情况

错误的解决方案:

def func(i):
    if i == 0:
        print(i)
        return i
    elif i > -2:
        i = i-1
        func(i)
        return(i)

print(func(3))

运行结果:
0

仍然图解一下,更直观

正确的解决方案一:

def func(i):
    if i == 0:
        print(i)
        return i
    elif i > -2:
        i = i-1
        return(func(i))

print(func(3))

运行结果:
0
0

正确的解决方案二:

result = None
def func(i):
    if i == 0:
        print(i)
        global result
        result = i
    elif i > -2:
        i = i-1
        func(i)
    return result

print(func(3))

运行结果:
0
0

参考文章

https://www.cnblogs.com/yechenkai/p/7143475.html

https://www.cnblogs.com/lincappu/p/8146141.html

python递归中的return"陷阱"的更多相关文章

  1. Java中try catch finally语句中含return语句的执行情况总结-编程陷阱

    前言:有java编程基础的人对java的异常处理机制都会有一定了解,而且可能感觉使用起来也比较简单,但如果在try catch finally语句块中遇到return语句,开发者可能就会遇到一些逻辑问 ...

  2. python中的return的返回与执行

    author:headsen  chen date:2018-03-21  15:12:09 notice:created by  headsen chen himself  and not allo ...

  3. python 中 try catch finally语句中含有return语句的执行情况

    无论是在try还是在except中,遇到return时,只要设定了finally语句,就会中断当前的return语句,跳转到finally中执行,如果finally中遇到return语句,就直接返回, ...

  4. python 正则表达式中反斜杠(\)的麻烦和陷阱

    这里是一点小心得:由于下面两个原因,在正则表达式中使用反斜杠就会产生了一个双重转换的问题. (1).python自身处理字符串时,反斜杠是用于转义字符 (2).正则表达式也使用反斜杠来转义字符     ...

  5. Python类中super()和__init__()的关系

    Python类中super()和__init__()的关系 1.单继承时super()和__init__()实现的功能是类似的 class Base(object): def __init__(sel ...

  6. python编程中的if __name__ == 'main与windows中使用多进程

    if __name__ == 'main 一个python的文件有两种使用的方法,第一是直接作为程序执行,第二是import到其他的python程序中被调用(模块重用)执行. 因此if __name_ ...

  7. 用Python递归解决阿拉伯数字转为中文财务数字格式的问题(2)--打开思路的一种方法

    几天前自己写了个将阿拉伯数字转为中文财务数字的程序.用的递归,不幸的是它是树形递归. 虽然实际过程中不太可能出现金额数字大到让Python递归栈溢出,但是始终是一块心病,这玩意终究在理论上是受限制的. ...

  8. Python 3 中的json模块使用

    1. 概述 JSON (JavaScript Object Notation)是一种使用广泛的轻量数据格式. Python标准库中的json模块提供了JSON数据的处理功能. Python中一种非常常 ...

  9. Python 面试中可能会被问到的30个问题

    第一家公司问的题目 1 简述解释型和编译型编程语言? 解释型语言编写的程序不需要编译,在执行的时候,专门有一个解释器能够将VB语言翻译成机器语言,每个语句都是执行的时候才翻译.这样解释型语言每执行一次 ...

随机推荐

  1. 如何理解Comparator接口中的升降序?

    import java.util.*; class DescType implements Comparator { public int compare(Object o1, Object o2) ...

  2. javafx 普通弹框提示

    new Alert(Alert.AlertType.NONE, "xxx不存在", new ButtonType[]{ButtonType.CLOSE}).show();

  3. ./bin/console server:run Surprise! There are no commands defined in the "server" namespace.

    Let's start the built-in web server:   ./bin/console server:run Surprise! There are no commands defi ...

  4. vloatile总结与synchronized对比

    原文地址:https://www.cnblogs.com/xiaoxian1369/p/5411877.html 1.要使volatile变量提供理想的线程安全,必须同时满足以下两个条件:1).对变量 ...

  5. pip3命令报错Fatal error in launcher: Unable to create process using '"d:\old_files\py3.6\python.exe" "E:\py3.6\Scripts\pip3.exe" list'

    cmd输入pip3 list命令报错 Fatal error in launcher: Unable to create process using '"d:\old_files\py3.6 ...

  6. python之路 模块,序列化,迭代器,生成器

    一.模块 1.模块简介 模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py.模块可以被别的程序引入,以使用该模块中的函数等功能.这也是使用python标准库的方法. 类似于函数式编程和面向过 ...

  7. 09_Hadoop启动或停止的三种方式及启动脚本

    1.Hadoop启动或停止 1)第一种方式 分别启动 HDFS 和 MapReduce,命令如下: 启动: $ start-dfs.sh $ start-mapred.sh 停止: $ stop-ma ...

  8. Windows彻底卸载VMWare虚拟机

    彻底卸载VMWare虚拟机 1.停止VMware相关服务 在服务中将VMware开头的所有服务停止 2.打开VMware安装向导 进入卸载页面 在卸载页面中选中VMware右键点击,进入更改后,页面为 ...

  9. 【Topcoder】SRM158 DIV2总结

    250分题:给定一个4位字符串initial和rotate这个字符串的方式,然后再给另一个字符串current,问current能否由initial通过rotate得到,需要几次rotate? 简单的 ...

  10. 【Head First Servlets and JSP】笔记13:session & cookie

    session的接口 杀死会话 cookie的性质 cookie的接口 再总结——cookie.session.JSESSIONID的前世今生 简单的定制cookie示例 1.session的接口,配 ...