递归
递归函数
递归函数是一种调用自身的函数。递归函数通常用于解决那些可以分解为相似子问题的问题。递归函数通常包含两个部分:基线条件(递归的终止条件)和递归条件(递归的调用)。
递归实现等差数列求和
问题描述及分析:
- 问题描述:给定一个整数n,计算等差数列的第n项。等差数列的定义是:每一项与前一项的差是一个常数,这个常数称为公差。例如,等差数列1, 4, 7, 10, 13, …的公差是3。
- 分析:在这个等差数列中,第n项可以通过以下公式计算:
第n项 = 第(n-1)项 + 3
,需要注意的是,在第一项时n = 1
同时这也是递归函数的约束条件。因此,我们可以使用递归函数来实现这个计算,即:如果n等于1,返回1;否则,返回find(n-1) + 3
。
函数实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| int find(int n) { int res; if (n == 1) { res = 1; } else { res = find(n - 1) + 3; }
return res; }
|
@brief 求解第n项的值
@param n 第n项
@return 第n项的值
函数解析:
- 如果n等于1,那么返回1,这是递归的基线条件,即递归的终止条件。
1 2 3 4
| else { res = find(n - 1) + 3; }
|
- 如果n不等于1,那么调用
find(n - 1)
来计算前一项,然后将前一项加上3,得到第n项。这是递归的条件,即递归的调用。
递归实现等比数列求和
问题描述及分析:
- 问题描述:给定一个整数n和一个初始值a,计算等比数列的前n项。等比数列的定义是:每一项是前一项乘以一个常数,这个常数称为公比。例如,等比数列1, 2, 4, 8, 16, …的公比是2。
- 分析:在这个等比数列中,第n项可以通过以下公式计算:
第n项 = 第(n-1)项 * 2
,需要注意的是,在第一项时n = 1
同时这也是递归函数的约束条件。因此,我们可以使用递归函数来实现这个计算,即:如果n等于1,返回a;否则,返回geometricRatio(n - 1) * 2
。
函数实现:
1 2 3 4 5 6 7 8 9 10 11 12 13
| int geometricRatio(int n) { int res; if (n == 1) { res = 2; } else { res = geometricRatio(n - 1) * 2; } return res; }
|
@brief 求解第n项的值
@param n 第n项
@return 第n项的值
函数解析:
- 如果n等于1,那么返回2,这是递归的基线条件,即递归的终止条件。
1 2 3 4
| else { res = geometricRatio(n - 1) * 2; }
|
- 如果n不等于1,那么调用
geometricRatio(n - 1)
来计算前一项,然后将前一项乘以2,得到第n项。这是递归的条件,即递归的调用。
递归实现阶乘
问题描述及分析:
- 问题描述:给定一个整数n,计算n的阶乘。阶乘的定义是:n! = n * (n-1) * (n-2) * … * 1。例如,5! = 5 * 4 * 3 * 2 * 1 = 120。
- 分析:在这个问题中,我们可以使用递归函数来实现计算阶乘。递归的基线条件是当n等于1时,返回1。否则,返回
factorial(n - 1) * n
。
函数实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| int factorial(int n) { int res; if (n == 1) { res = 1; } else { res = factorial(n - 1) * n; }
return res; }
|
@brief 求解n的阶乘
@param n 第n项
@return n的阶乘
函数解析:
- 如果n等于1,那么返回1,这是递归的基线条件,即递归的终止条件。
1 2 3 4
| else { res = factorial(n - 1) * n; }
|
- 如果n不等于1,那么调用
factorial(n - 1)
来计算前一项,然后将前一项乘以n,得到n的阶乘。这是递归的条件,即递归的调用。