学算法阶段时不时会遇到一些递归的应用场景,例如DFS,二叉树等相关的题目,递归常常能大展身手。不过有意思的一件事情是,若我们把一些本该迭代的算法改成递归实现,会是什么样的情形。
这是一个很简单的矩阵加法的例子。
void matrixAdd(const std::vector>& a,
const std::vector>& b,
std::vector>& c)
{
int n1 = a.size(), m1 = a[0].size();
int n2 = b.size(), m2 = b[0].size();
assert(n1 == n2 && m1 == m2);
for (int i = 0; i
同样有递归版本,很多时候这两者都是可以相互转换的。
void __matrixAdd(const std::vector>& a, const std::vector>& b,
std::vector>& c, int row, int col)
{
if (row == static_cast(a.size()))
return;
if (col == static_cast(a[0].size()))
{
__matrixAdd(a, b, c, row + 1, 0);
return;
}
c[row][col] = a[row][col] + b[row][col];
__matrixAdd(a, b, c, row, col + 1);
}
void matrixAdd(const std::vector>& a,
const std::vector>& b,
std::vector>& c)
{
int n1 = a.size(), m1 = a[0].size();
int n2 = b.size(), m2 = b[0].size();
assert(n1 == n2 && m1 == m2);
__matrixAdd(a, b, c, 0, 0);
}
当row越界的时候,直接return不用再往下操作了;而当col越界的时候,可以往下一行重新进行相加操作,这里也要return,不然后续的操作会导致越界。可以直观看到代码并没有用到for循环,看起来比较简练。接下来是冒泡排序。
void bubbleSort(std::vector& arr) {
int n = arr.size();
// 进行 n-1 轮的冒泡排序
for (int i = 0; i arr[j + 1]) {
std服务器托管网::swap(arr[j], arr[j + 1]);
}
}
}
}
void bubbleSortRecursive(std::vector& arr, int n) {
// 基本情况:如果只剩下一个元素,已经有序
if (n == 1) {
return;
}
// 一次遍历,将最服务器托管网大的元素移动到末尾
for (int i = 0; i arr[i + 1]) {
std::swap(arr[i], arr[i + 1]);
}
}
// 递归调用,对除了最后一个元素的子数组进行排序
bubbleSortRecursive(arr, n - 1);
}
相比原来的迭代版本少了一个for循环,代码量相差不大。再来看看斐波那契数列,通常它的递归实现是只保留最后一项的,我们也可以写一个保留中间计算过程的版本。
int fib(std::vector& arr, int n) {
if (n
字符串翻转也是很容易实现的。
void reverseString(std::string& str, int left, int right) {
if (left >= right) {
return;
}
// 交换左右字符
std::swap(str[left], str[right]);
// 递归翻转剩余部分
reverseString(str, left + 1, right - 1);
}
先到这里,有什么好的想法也可以提一提~
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
信安这个行业3年前各大媒体,信安自己人都觉得自己在个朝阳行业,红利在咋弄不得再吃5年。 现在拉个干网络安全的再去问问,看看谁不是去年年终奖砍了一半、或者根本就没了,再或者每天岌岌可危生怕去领大礼包。 原本10月份的激励性调薪,直到这几天才发布,我去涨了450,…