递归的思想就是一层一层扒皮,最后的芯要能结束递归。
数组求和
对于数组求和应用递归,显然拿出数组的最后一个数和剩下的数组和相加,剩下的数组和由倒数第二个数和之前的数组和相加,最后当数组长度为0时,返回0.
- 算法实现
int arr_sum(int a[], int length)
{
if (length == 0)
{
return 0;
}
else
return arr_sum(a, length - 1) + a[length - 1];
}
- 测试用例
#include <iostream>
using namespace std;
int arr_sum(int a[], int length)
{
if (length == 0)
{
return 0;
}
else
return arr_sum(a, length - 1) + a[length - 1];
}
int main(int argc, char const *argv[])
{
int array[] = {1, 3, 4, 5, 23};
int len = 0;
int sum = 0;
len = sizeof(array) / sizeof(array[0]);
sum = arr_sum(array, len);
cout << sum << endl;
return 0;
}
两个数的最大公约数
毫无疑问要用辗转相除法,或者称为欧几里得算法
- 算法实现
int gcd(int p, int q)
{
if (q == 0)
{
return p;
}
else
{
int r = p % q;
return gcd(q, r);
}
}
- 测试用例
#include <iostream>
using namespace std;
int gcd(int p, int q)
{
if (q == 0)
{
return p;
}
else
{
int r = p % q;
return gcd(q, r);
}
}
int main(int argc, char const *argv[])
{
int p = 12,
q = 32;
cout << p << "与" << q << "的最大公约数为" << gcd(p, q) << endl;
return 0;
}
最小公倍数
假设两个数p, q.
p可以分解成m * n,而q可以分解成m * k, 那么m就是他们的最大公约数,而m * n * k就是他们的最小公倍数。
int lcm(int p, int q)
{
return p * q / gcd(p, q);
}