2个整型值M和N(M,N均大于0)的最大公约数可以按照下面的方法计算:
编写函数,接受2个整型参数,并返回这2个数的最大公约数,如果这2个参数中的任何一个不大于0,函数应该返回0。
这个抽象出来的公式一看就是一个递归的形式,所以首先第一种方法使用递归来实现以下:
递归法:
int gcd(int m, int n) {\
if(m < 0 || n < 0) {
return 0;
}
int r = m%n;
if(r == 0) {
return n;
} else {
return gcd(n, r);
}
}
int main () {
printf("gcd : %ld", gcd(3,6));
return 0;
}
迭代法:
我们之前讲到过尾部递归,就是函数中最后一步就是调用函数本身那这个就是尾部递归,可以很容易的转化为迭代的方式:
int gcd(int m, int n) {\
if(m < 0 || n < 0) {
return 0;
}
int r;
do {
r = m % n;
m = n;
n = r;
} while(r > 0);
return m;
}
int main () {
printf("gcd : %ld", gcd(3,6));
return 0;
}