在写一个展转相除求最小公因数的程序的时候,忽然发现本身无论怎么写(除了两数恰巧能够整除),return 返回的值恒为 none。算法
代码为此:函数
1 def gcd(a,b): 2 if a%b==0: 3 return b 4 else: 5 gcd(b,a%b)
总之调试一下,获得的结果是各部分输出正常。spa
而后用循环作了一遍:调试
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。结果正确。code
因而能够确定,算法没有问题,可是不服气啊,凭什么递归作不出来,摆着试试的想法,把return换成了print。输出正常。blog
而后就更加摸不着头脑了,为何 print 能够,你 return 就不行。递归
因而开始百度 Return 的用法,调用函数的时候,若是没有执行 return 命令(或 return 命令未接收数据),默认会返回 none 。class
翻了一会终于想明白:这样一个递归函数,其实重复调用了屡次这个函数,咱们来分解一下这些步骤。百度
首先,第一次调用通过 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]上增长输出口解决了这一问题。