求两个数的最大公约数
1
2
3
4
5
6
7
8
|
long gcd(long m, long n) {
while (n != 0) {
long ren = m % n;
m = n;
n = ren;
}
return m;
}
|
幂运算
时间复杂度为O(logN)的算法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
/**
* 求幂运算
*
* @param x
* 底数
* @param n
* 指数
* @return 结果
*/
long pow(int x, int n) {
if (n == 0) {
return 1;
}
if (n % 2 == 0) {
return pow(x * x, n / 2);
} else {
return pow(x * x, n / 2) * x;
}
}
|
阶乘
传统递归版:
1
2
3
|
long fab(n) {
return n==1 ? 1 : n * fab(n-1);
}
|
尾递归版:
尾递归: 避免每一次递归都在堆栈中保存一个局部变量(普通递归会在每个栈中存储中间值n
)。性能更优,可防止内存溢出。
1
2
3
4
5
6
7
|
long fab(n) {
return fab(n,1);
}
long fab(n,a) {
return n==1? a : fab(n-1,n*a);
}
|