求两个数最大公约数,欧几里得算法,这两种方法除第一种可以避免除数为零的情况,两者有什么区别?谢谢
public static int gcd(int p, int q)
{
if (q == 0) return p;
int r = p % q;
return gcd(q, r) ;
}
public static int gcd(int p, int q)
{
int r = p % q;
if (r == 0)
return q;
return gcd(q, r);
}
第二种最大公约数包括自身
第二个方法比第一个少一次递归调用,个人愚见。
第二段代码是尾递归,换言之可以不用递归了。
第1个除了第一次会避免除0外,其它都一样
第一种和第二种的区别就像
Do{ }While{}和Loop{}Until{}的区别一样
前者至少执行一次循环
而你这两个算法前者至少执行一次递归
比如说两个相同的非零数字 24和24
第二次可以直接得出r=0,然后return
第一次还要把r=0这个判断留到下次递归再进行