c++这个求最大公约数的函数求大佬分析!!!

c++这个求最大公约数的函数求大佬分析!!!如图,主要是标注的那个函数,我在网上看到的,虽然我能理解辗转相除法,但是看到这个我分析了半天还是懵了。之前自己写都是用辗转相除写的比较多,这尼玛一行就搞定了,还不用判断两个数谁大谁小要不要互换位置的问题,决定以后就按这个写了!但是希望有个大佬来帮我分析一下为啥这样写可以

辗转相除法终止条件就是余数为0,也就是n=0,这时候条件语句按照后半段取值,返回m,也就是最终的最大公约数。而当n!=0时的算法是递推公式gcd(m,n)=gcd(n,m%n)
至于交换大小,当m<n的时候m%n=m相当于gcd(m,n)=gcd(n,m)就调整好大小顺序了,之后后一个参数都是严格小于前一个的,就没有顺序问题了。
不过这么写不确定有没有尾递归优化,可能有性能损失。不过估计编译器会按照if优化掉,不至于爆栈
温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-06-29
这是一种使用递归求最大公约数的方法。
假设在13行调用gcd函数时,a的值为7,b的值为35;进入gcd函数执行第六行代码,这个函数只有当n的值等于0的时候,才会停止递归;现在我们的n其实就是35,不满足条件则执行gcd(n,m%n)进行递归;这时候递归到一个新的函数,现在的m是35,n是7(因为7%35的结果为7),然后再执行第六行代码,发现n依然不等于0;继续递归也就是执行gcd(n,m%n),现在m的值为7,n的值为0(因为35%7的结果为0)。
以上是对这个函数进行的举例说明,其实主要还是在gcd(n,m%n)这个代码上,自己慢慢体会下,不难掌握的。追问

贼6,说的我都懂了

第2个回答  2018-06-29
递归
一直调用gcd(int m,int n)

具体的你可以单步调试走一下,这个方式应该资源占用会多些
相似回答