c++递归教程

递归是什么?

先给大家讲个小故事:

从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事:“从前有座山,山里有座庙 ,庙里有个老和尚在给小和尚讲故事:”从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事……

我们发现,如果老和尚没有被别人打扰,这个故事可以无限地讲下去

我们也可以c++来表现这一过程:

void f(){
	cont<<"从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事:“";
	//输出故事 
	f(); 
	//这里很重要,在第一层f()函数运行后,会输出从前有座山……
	//输出完后,函数f()会执行f()函数,在这时候,第一层f()函数
	//已经结束了,接下来,程序会运行第二层f()函数,也就是f()函数
	//执行的时候,有一次运行了f()…… 
}

注意!这个地方一定要懂,不然接下来的你全听不懂

如果我们运行f()函数,会发生什么?

程序也会和老和尚一样,一直讲故事,永远停不下来,如果想让程序停下来,只能自己关掉

如果,我想让程序能像循环一样停下来,要怎么办呢?

我们只要这样写就好了:

void f(n){
	if(n==0)return;
	cont<<"从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事:“";
	f(n-1); 
}

看似只多写了几个字,其实暗藏玄机,我们看,现在这个函数增加了变量n,只要n等于0,就不会输出,直接结束这个函数(函数f(0)会直接结束),而每次,我们使用函数的时候,n都会-1,所以,这个函数是会结束的

如果运用好这种函数的写法,我们甚至能解决题目,比如题目让我们输出n个1,我们就可以用这样的函数解决这道题

这样自己调用自己来解决问题的解题方法,就叫做递归

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个基于控制台的简单扫雷游戏的 C++ 实现。这个游戏是一个经典的单人游戏,目标是在避免踩雷的情况下清理所有的方块。 ```c++ #include <iostream> #include <vector> #include <cstdlib> #include <ctime> using namespace std; // 游戏难度常量 const int EASY = 10; const int MEDIUM = 20; const int HARD = 30; // 方块类型常量 const char COVERED = '-'; const char UNCOVERED = ' '; const char FLAGGED = 'F'; // 方块结构体 struct Square { bool isMine; int nearbyMines; char display; }; // 游戏类 class Minesweeper { public: Minesweeper(int difficulty); void play(); private: void printBoard(); bool isWin(); bool isLose(int row, int col); void uncover(int row, int col); void flag(int row, int col); int numMines; vector<vector<Square>> board; }; // 构造函数 Minesweeper::Minesweeper(int difficulty) { // 初始化随机数生成器 srand(time(nullptr)); // 根据难度设置雷数 switch (difficulty) { case EASY: numMines = 10; break; case MEDIUM: numMines = 40; break; case HARD: numMines = 99; break; } // 初始化棋盘 for (int i = 0; i < difficulty; i++) { vector<Square> row(difficulty); for (int j = 0; j < difficulty; j++) { row[j].isMine = false; row[j].nearbyMines = 0; row[j].display = COVERED; } board.push_back(row); } // 随机分布雷 int count = 0; while (count < numMines) { int row = rand() % difficulty; int col = rand() % difficulty; if (!board[row][col].isMine) { board[row][col].isMine = true; count++; } } // 计算每个方块周围雷的数量 for (int i = 0; i < difficulty; i++) { for (int j = 0; j < difficulty; j++) { if (!board[i][j].isMine) { int count = 0; for (int k = -1; k <= 1; k++) { for (int l = -1; l <= 1; l++) { if (i+k >= 0 && i+k < difficulty && j+l >= 0 && j+l < difficulty) { if (board[i+k][j+l].isMine) { count++; } } } } board[i][j].nearbyMines = count; } } } } // 打印棋盘 void Minesweeper::printBoard() { cout << " "; for (int i = 0; i < board.size(); i++) { cout << i << " "; } cout << endl; for (int i = 0; i < board.size(); i++) { cout << i << " "; for (int j = 0; j < board.size(); j++) { cout << board[i][j].display << " "; } cout << endl; } } // 判断是否胜利 bool Minesweeper::isWin() { int count = 0; for (int i = 0; i < board.size(); i++) { for (int j = 0; j < board.size(); j++) { if (board[i][j].isMine) { if (board[i][j].display == FLAGGED) { count++; } } else { if (board[i][j].display == UNCOVERED) { count++; } } } } return count == board.size() * board.size() - numMines; } // 判断是否踩雷 bool Minesweeper::isLose(int row, int col) { return board[row][col].isMine; } // 揭开方块 void Minesweeper::uncover(int row, int col) { if (row < 0 || row >= board.size() || col < 0 || col >= board.size()) { return; } if (board[row][col].display != COVERED) { return; } board[row][col].display = UNCOVERED; if (board[row][col].isMine) { return; } if (board[row][col].nearbyMines == 0) { uncover(row-1, col-1); uncover(row-1, col); uncover(row-1, col+1); uncover(row, col-1); uncover(row, col+1); uncover(row+1, col-1); uncover(row+1, col); uncover(row+1, col+1); } } // 标记方块 void Minesweeper::flag(int row, int col) { if (board[row][col].display == COVERED) { board[row][col].display = FLAGGED; } else if (board[row][col].display == FLAGGED) { board[row][col].display = COVERED; } } // 游戏主函数 void Minesweeper::play() { bool gameover = false; while (!gameover) { printBoard(); cout << endl; cout << "Enter row and column (e.g. 2 3) or 'f' to flag: "; char c; cin >> c; if (c == 'f') { int row, col; cout << "Enter row and column (e.g. 2 3): "; cin >> row >> col; flag(row, col); } else { int row = c - '0'; int col; cin >> col; uncover(row, col); if (isLose(row, col)) { printBoard(); cout << "You lose!" << endl; gameover = true; } else if (isWin()) { printBoard(); cout << "You win!" << endl; gameover = true; } } } } // 主函数 int main() { int difficulty; cout << "Select difficulty (10 for easy, 20 for medium, 30 for hard): "; cin >> difficulty; Minesweeper game(difficulty); game.play(); return 0; } ``` 在这个实现中,我们首先定义了一个 `Square` 结构体,表示一个方块。其中 `isMine` 表示是否有雷,`nearbyMines` 表示周围雷的数量,`display` 表示方块的显示状态。 然后我们定义了一个 `Minesweeper` 类,表示扫雷游戏。在构造函数中,我们根据难度设置雷数,并随机分布雷。然后计算每个方块周围雷的数量。在主函数中,我们让用户选择游戏难度,并开始游戏。 在游戏过程中,我们通过 `printBoard` 函数打印棋盘,让用户输入行和列号或者 'f' 标记方块。如果用户选择揭开方块,则我们通过 `uncover` 函数递归地揭开周围没有雷的方块,直到遇到有雷的方块或者边界。如果用户选择标记方块,则我们通过 `flag` 函数将方块标记为旗帜或覆盖状态。当用户揭开有雷的方块时,游戏失败,当用户揭开所有没有雷的方块时,游戏胜利。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值