zoukankan      html  css  js  c++  java
  • 【python】关于函数递归使用 return 后,收到数据为 None。

      在写一个辗转相除求最小公因数的程序的时候,突然发现自己不管怎么写(除了两数恰巧可以整除),return 返回的值恒为 none。

      代码为此:

    1 def gcd(a,b):
    2     if a%b==0:
    3         return b
    4     else:
    5         gcd(b,a%b)

      总之调试一下,得到的结果是各部分输出正常。

      然后用循环做了一遍:

    1 def gcd(a,b):
    2     a=int(a)
    3     b=int(b)
    4     while a%b!=0:
    5         save=a
    6         a=b
    7         b=save%b
    8     return b

      输入a=25,b=15,收到的结果是5。结果正确。

      于是可以肯定,算法没有问题,但是不服气啊,凭什么递归做不出来,摆着试试的想法,把return换成了print。输出正常。

      然后就更加摸不着头脑了,为什么 print 可以,你 return 就不行。

      于是开始百度 Return 的用法,调用函数的时候,如果没有执行 return 命令(或 return 命令未接收数据),默认会返回 none 。

      翻了一会终于想明白:这样一个递归函数,其实重复调用了多次这个函数,我们来分解一下这些步骤。

      首先,第一次调用经过 if 后,第二次调用了该函数,假设此次调用通过 if 即可达到设定好的 return,函数返回计算出的值 X,然而这次 return 相当于是 return 到了第一次调用的gcd(b,a%b)身上,而该行代码上没有 return。假设输入a=25,b=5,数据之所以正常返回,是因为这个过程里只有第一次调用。

      想象一套有单独分开的出入口的俄罗斯套娃,这就相当于是在这些套娃上为数据打开了向内的入口,并且只打开了最外部套娃的出口,于是数据便只能入不能出,故此返回的就全是 none 了。

      遂将代码改成这样:

    1 def gcd(a,b):
    2     if a%b==0:
    3         return b
    4     else:
    5         return (gcd(b,a%b))

      通过在 gcd(b,a%c) [第N次调用函数所得的值,N>=2]上增加输出口解决了这一问题。

  • 相关阅读:
    POJ 2794 Exploring Pyramids
    POJ 2282 The Counting Problem
    eclipse中设置java注释模板
    eclipse复制工程需要注意的地方
    extjs的强大利器GUI设计工具(extjs designer)
    eclipse项目名前出现红色感叹号,小红叉解决(转)
    上传一份个人学习struts2的历程笔记
    struts2中的action与actioncontext的理解
    J2EE后台UI系统框架搭建EXTJs使用(4.1 GPL版本)
    java.lang.OutOfMemoryError: Java heap space 解决方法转测试可用
  • 原文地址:https://www.cnblogs.com/yechenkai/p/7143475.html
Copyright © 2011-2022 走看看