如何将二维数组字符替换的嵌套循环转为递归函数?
递归实现二维数组字符替换与计数
首先,咱们先聊聊你写的递归函数哪里出问题了:
- 终止条件逻辑完全错误:
row+1 != length - 1和col+1 != length - 1这种判断根本没法正确控制递归结束,反而会导致大量重复遍历同一个元素;尤其是return 1 + replace_char(array, row, col)这行,会直接引发无限递归——它一直在调用当前位置,永远停不下来。 - 遍历顺序混乱:你同时递归下一行和下一列,会让数组元素被重复处理多次,最终计数肯定不对。
原嵌套循环是行优先顺序遍历(先走完一行的所有列,再切换到下一行),咱们的递归也得遵循这个逻辑,才能和原循环完全等价。
正确的递归实现思路
递归的核心是把大问题拆成小问题,咱们按以下逻辑来:
- 终止条件:
- 如果当前行号
row >= length,说明所有元素都遍历完了,返回0。 - 如果当前列号
col >= length,说明当前行的元素都处理完了,递归处理下一行的第一列,返回对应的计数。
- 如果当前行号
- 处理当前元素:
- 先判断当前
array[row][col]是不是'b',如果是,替换成'a',当前贡献为1;否则为0。 - 递归处理下一个列位置(当前行的下一列),把当前贡献加上递归返回的计数,就是最终的总计数。
- 先判断当前
完整代码实现
#include <iostream> using namespace std; const int length = 4; // 递归函数:返回替换的总次数 int replace_char(char array[][length], int row, int col) { // 终止条件1:所有行都遍历完成 if (row >= length) { return 0; } // 终止条件2:当前行的所有列遍历完成,递归处理下一行的第一列 if (col >= length) { return replace_char(array, row + 1, 0); } // 处理当前元素 int current_count = 0; if (array[row][col] == 'b') { array[row][col] = 'a'; current_count = 1; } // 递归处理下一列,累加计数 return current_count + replace_char(array, row, col + 1); } int main() { char table[length][length] = { {'a','b','a','a'}, {'a','a','a','b'}, {'a','a','b','a'}, {'b','b','a','a'} }; int count = replace_char(table, 0, 0); // 从第0行第0列开始遍历 cout << "Count: " << count << endl; // 可选:打印数组验证替换结果 cout << "Updated table:" << endl; for (int i = 0; i < length; i++) { for (int j = 0; j < length; j++) { cout << table[i][j] << " "; } cout << endl; } return 0; }
代码解释
- 调用递归时,从
(0,0)也就是数组的第一个元素开始遍历。 - 每处理完一个元素,就递归到当前行的下一列;当当前行的列全部处理完,就自动跳到下一行的第一列。
- 当所有行都处理完,递归终止,返回累计的总计数。
- 这个逻辑和原嵌套循环完全等价,每个元素只会被遍历处理一次,不会重复。
测试结果
运行后会输出:
Count: 5 Updated table: a a a a a a a a a a a a a a a a
和原循环的结果完全一致(原数组里共有5个'b')。
内容的提问来源于stack exchange,提问作者keanehui
相关产品推荐
相关产品推荐

