用c++写一个递归程序
时间: 2023-11-25 18:08:35 浏览: 35
好的,下面是一个用C语言编写的递归程序,用于计算斐波那契数列的第n个数:
```c
#include <stdio.h>
int fibonacci(int n) {
if (n <= 1) {
return n;
} else {
return fibonacci(n-1) + fibonacci(n-2);
}
}
int main() {
int n = 10; // 计算斐波那契数列的第10个数
int result = fibonacci(n);
printf("斐波那契数列的第%d个数是%d\n", n, result);
return 0;
}
```
这个程序使用了递归的思想,计算斐波那契数列的第n个数,如果n小于或等于1,则直接返回n,否则递归计算前两个数的和。在main函数中调用fibonacci函数,并输出计算结果。
相关问题
用C++写一个扫雷程序
好的,下面是一个简单的扫雷程序示例:
```cpp
#include <iostream>
#include <vector>
#include <time.h>
using namespace std;
class MineSweeper {
private:
int row;
int col;
int mineNum;
vector<vector<int>> board; // 记录每个格子的状态,0-未翻开,1-已翻开,2-标记为地雷,3-标记为问号
vector<vector<bool>> mine; // 记录每个格子是否是地雷
public:
MineSweeper(int r, int c, int m) : row(r), col(c), mineNum(m) {
board.resize(row, vector<int>(col, 0));
mine.resize(row, vector<bool>(col, false));
srand((unsigned int)time(NULL));
while (mineNum > 0) { // 随机布雷
int x = rand() % row;
int y = rand() % col;
if (!mine[x][y]) {
mine[x][y] = true;
mineNum--;
}
}
}
void printBoard() { // 打印游戏界面
cout << " ";
for (int j = 0; j < col; j++) {
cout << j << " ";
}
cout << endl;
cout << " ";
for (int j = 0; j < col; j++) {
cout << "--";
}
cout << endl;
for (int i = 0; i < row; i++) {
cout << i << " | ";
for (int j = 0; j < col; j++) {
if (board[i][j] == 0) {
cout << ". ";
} else if (board[i][j] == 1) {
if (mine[i][j]) {
cout << "* ";
} else {
int cnt = countMine(i, j);
cout << (cnt > 0 ? to_string(cnt) : " ") << " ";
}
} else if (board[i][j] == 2) {
cout << "@ ";
} else if (board[i][j] == 3) {
cout << "? ";
}
}
cout << "|" << endl;
}
cout << " ";
for (int j = 0; j < col; j++) {
cout << "--";
}
cout << endl;
}
void play(int x, int y) { // 玩家翻开一个格子
if (board[x][y] == 1 || board[x][y] == 2) { // 已经翻开或标记为地雷,不能再操作
return;
}
if (mine[x][y]) { // 翻开的是地雷,游戏结束
board[x][y] = 1;
printBoard();
cout << "Game Over!" << endl;
return;
}
board[x][y] = 1;
int cnt = countMine(x, y);
if (cnt == 0) { // 周围没有地雷,递归翻开周围的格子
for (int i = -1; i <= 1; i++) {
for (int j = -1; j <= 1; j++) {
if (x + i >= 0 && x + i < row && y + j >= 0 && y + j < col && !(i == 0 && j == 0)) {
play(x + i, y + j);
}
}
}
}
printBoard();
}
void mark(int x, int y) { // 玩家标记一个格子为地雷或问号
if (board[x][y] == 1) { // 已经翻开,不能再操作
return;
}
if (board[x][y] == 2) { // 已经标记为地雷,改为问号
board[x][y] = 3;
} else if (board[x][y] == 3) { // 已经标记为问号,改为未翻开
board[x][y] = 0;
} else { // 未标记,改为地雷
board[x][y] = 2;
}
printBoard();
}
private:
int countMine(int x, int y) { // 统计周围的地雷数量
int cnt = 0;
for (int i = -1; i <= 1; i++) {
for (int j = -1; j <= 1; j++) {
if (x + i >= 0 && x + i < row && y + j >= 0 && y + j < col && mine[x + i][y + j]) {
cnt++;
}
}
}
return cnt;
}
};
int main() {
int row, col, mineNum;
cout << "Please input the row number of the board: ";
cin >> row;
cout << "Please input the column number of the board: ";
cin >> col;
cout << "Please input the number of mines: ";
cin >> mineNum;
MineSweeper game(row, col, mineNum);
game.printBoard();
while (true) {
int x, y;
char op;
cout << "Please input the operation (P-play, M-mark): ";
cin >> op;
cout << "Please input the row and column number of the cell: ";
cin >> x >> y;
if (op == 'P') {
game.play(x, y);
} else if (op == 'M') {
game.mark(x, y);
}
}
return 0;
}
```
该程序实现了基本的扫雷游戏功能,包括随机布雷、打印游戏界面、玩家翻开格子、统计周围地雷数量、递归翻开周围的格子、玩家标记格子为地雷或问号等。程序使用了对象-oriented 的设计思想,将游戏逻辑封装在 MineSweeper 类中,方便调用和维护。
用c++写一个SNL语法分析递归下降程序
SNL是一种类Pascal语言,下面是一个简单的SNL语法分析递归下降程序的示例:
```c++
#include <iostream>
#include <string>
using namespace std;
string input; // 存储输入的字符串
int index = 0; // 当前处理的字符在输入字符串中的下标
// 抛出异常
void error(string msg)
{
cout << "Error: " << msg << endl;
exit(0);
}
// 匹配当前字符
void match(char c)
{
if (input[index] == c) {
index++;
} else {
error("expect " + string(1, c));
}
}
// 分析 <程序>
void program()
{
match('p');
match('r');
match('o');
match('g');
match('r');
match('a');
match('m');
block();
match('.');
}
// 分析 <分程序>
void block()
{
match('b');
match('e');
match('g');
while (input[index] != 'e') {
statement();
}
match('e');
match('n');
}
// 分析 <语句>
void statement()
{
if (input[index] == 'i') {
match('i');
match('d');
match('=');
expression();
} else if (input[index] == 'b') {
block();
} else {
error("unexpected token");
}
}
// 分析 <表达式>
void expression()
{
if (isdigit(input[index])) {
match(input[index]);
} else {
error("unexpected token");
}
}
// 程序入口
int main()
{
cout << "Enter input: ";
getline(cin, input);
program();
cout << "Parsing completed." << endl;
return 0;
}
```
需要注意的地方:
1. 输入的字符串必须以 "program" 开头,以 "." 结尾。
2. 分程序以 "beg" 开头,以 "end" 结尾。
3. 语句只支持赋值语句和分程序。
4. 表达式只支持数字。