|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
作业要求是编写一个函数,利用欧几里得算法求最大公约数
- >>> def gcd(a,b):
- if a<b:
- a,b=b,a
- k=a%b
- if k==0:
- print(b)
- return b
- else:
- gcd(b,k)
- >>> gcd(12,4)
- 4
- 4
- >>> gcd(3,1)
- 1
- 1
- >>> gcd(5,3)
- 1
- >>>
复制代码
这是我编写的求最大公约数的函数,可是有一个问题,为什么当求5和3的最大公约数时,只能通过print(b)这个语句打印初1,而return b 这个语句就不起作用了,其他时候,return b的语句都会有作用。谢谢各位大神帮忙看看。
本帖最后由 和vvv 于 2017-7-24 16:24 编辑
因为前面两个gcd(12,4)和gcd(3,1)都没有递归调用,直节在这一步结束程序:
- if k==0:
- print(b)
- return b
复制代码
所以会有返回值。而gcd(5,3)第一次k = 5 % 3 = 2,不为零,因此递归调用gcd(3,2),一直调用,直到k=0。这是返回值b=1。 但是递归调用并没有结束,还有一个回溯过程。现将这个返回值传到上一层,一直到最后。所以最后的返回值在else下的函数中,因此,这样可以保证能够有返回值:
- def gcd(a, b):
- if a < b:
- a, b = b, a
- k = a % b
- if k == 0:
- print(b)
- return b
- else:
- w = gcd(b, k)
- return w
- f = gcd(5, 3)
- print(f)
复制代码
而如果还是你那种写法,遇到递归调用的情况,最终的返回值保存在这里:
但并没有return语句,因此会返回空,也就是None。这就是为什么gcd(5,3)没有打印出返回值的原因。
|
|