这里写目录标题
- 递归的思想
- 序列求最大值
- 翻转字符串
- 斐波那契数列
- 数塔
- 回文字符串
- 上楼
- 汉诺塔
- 棋盘覆盖问题
- 数字螺旋矩阵
- 盒分形
递归的思想
子问题须与原始问题为同样的事,且更为简单。
不能无限制地调用本身,须有个出口,化简为非递归状况处理
序列求最大值
求出输出n个数据中的最大值
方法一:直接一边输出然后进行比较大小
方法二:利用数组然后用递归的思想进行
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100;
int a[N];//全局变量嘛,随意函数不需要再一次的定义了
int fin(int n)
{if (n == 1){return a[1];}else return max(fin(n - 1), a[n]);
}
int main()
{int n; cin >> n; for (int i = 0; i < n; i++) {cin >> a[i]; }printf("%d", fin(n)); return 0;
}
翻转字符串
//其中考察的知识点有tring sub2 = s.substr(5, 3); //从下标为5开始截取长度为3位:sub2 = “567”
//需要知道的是在c++中string库中 字符相加是自动的链接的
//翻转字符串
//利用了一个函数s.substr()
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
const int N = 1001;
string s;
string reverse(int n)
{if (n == 1) {return s.substr(0, 1); }else return s.substr(n - 1, 1) + reverse(n - 1);
}
int main()
{cin >> s; cout << reverse(s.length()) << endl; return 0;
}
斐波那契数列
雯波那契数列
给定一个正整数n,求结果第n项f[n]
当n=1时,f[n]=1 n=2时 f[n]=1
n>2时 f(n)=f(n-1)+f(n-2)
#include <cstdio> int f(int n) { if (n <= 2) { return 1; } else { return f(n - 1) + f(n - 2); }
}int main() { int n; scanf("%d", &n); printf("%d\n", f(n)); return 0;
}
数塔
//#include<iostream>
//#include<algorithm>
//using namespace std;
//const int N = 1001;
//int a[N][N], n;
//int getmax(int i, int j)//从左边和右边分别求出最大值的路径,递归的方式
//{
// if (n == i)//这个是到n层是的条件,进行反向的输出数据
// {
// return a[n][j];
// }
// else
// {
// return max(getmax(i + 1, j), getmax(i + 1, j + 1));//求出的是左右边值的最大值
// }
//
//}
//int main()
//{
// cin >> n;
// for (int i = 1; i <= n; i++)
// {
// for (int j = 1; j <= i; j++)//纵坐标是根据衡坐标来的,但是本质上还是二维数组
// {
// cin >> a[i][j];
// }
// }
// printf("%d", getmax(1, 1));//调用二维数组衡坐标和纵坐标
// return 0;
//}
回文字符串
//运用的是true进行判断的,实际的效果真的很好
//注意的点:
//求字符串的长度的时候,用s.length()本身自带的函数
//利用布尔函数进行
#include<iostream>
using namespace std;
string s;
bool personer(int i, int j)
{if (i >= j){return true;}else return (personer(i + 1, j - 1) && s[i] == s[j]);
}
int main()
{cin >> s; //判断是不是回文,'YES'是true,’NO‘是false cout << personer(0, s.length() - 1) ? "YES" : "NO" << endl; return 0;
}
上楼
上楼问题,一共有n级台阶,每次选择上一级或者两级
例如当 n=3时,共有三种方式上楼:
一级->一级->一级;
一级->二级;
二级->一级。
因为就只有两种方式,所以
#include <cstdio>
int f(int n)
{if (n <= 1) {return 1;}else {return f(n - 1) + f(n - 2);}
}
int main()
{int n; scanf("%d", &n); printf("%d\n", f(n)); return 0;
}
汉诺塔
//#include <cstdio>
//#include <cmath>
//void moveHanoi(int n, char from, char to, char mid)
//{
// if (n == 0)
// {
// return;
// }
// else
// {
// moveHanoi(n - 1, from, mid, to);
// printf("%c->%c\n", from, to);
// moveHanoi(n - 1, mid, to, from);
// }
//}
//
//int main()
//{
// int n;
// scanf("%d", &n);
// printf("%d\n", (int)pow(2.0, 1.0 * n) - 1);
// moveHanoi(n, 'A', 'C', 'B');
// return 0;
//}//步骤,将n-1个圆盘移动到辅助柱上面,最后一个移动到目标柱,然后将辅助柱上的所有移动到目标柱子上面
//void hanoi(int num,char sou, char tar, char aux)//圆盘的个数,起始点,目标点,辅助点
//{
// static int count = 1;
// if (num == 1)
// {
// cout << "第" << count << "次:从<<sou<<"移动到" <<tar<<endl;// count++
// }
// else
// {
// hanoi(num - 1, sou, aux, tar);
// cout << "第" << count << "次:从" << sou << "移动到" << tar << endl;// count++;
// hanoi(num - 1, aux, tar, sou);
// }
//}
棋盘覆盖问题
#include <iostream>
int tile = 1; // 骨牌序号
int board[128][128]; // 二维数组模拟棋盘// (tr,tc)表示棋盘的左上角坐标(即确定棋盘位置), (dr,dc)表示特殊方块的位置, size=2^k确定棋盘大小
void chessBoard(int tr, int tc, int dr, int dc, int size)
{// 递归出口if (size == 1)return;int s = size / 2; //分割棋盘int t = tile++; //t记录本层骨牌序号// 判断特殊方格在不在左上棋盘if (dr < tr + s && dc < tc + s){chessBoard(tr, tc, dr, dc, s); //特殊方格在左上棋盘的递归处理方法}else{board[tr + s - 1][tc + s - 1] = t; // 用t号的L型骨牌覆盖右下角chessBoard(tr, tc, tr + s - 1, tc + s - 1, s); // 递归覆盖其余方格}// 判断特殊方格在不在右上棋盘if (dr < tr + s && dc >= tc + s){chessBoard(tr, tc + s, dr, dc, s);}else{board[tr + s - 1][tc + s] = t;chessBoard(tr, tc + s, tr + s - 1, tc + s, s);}// 判断特殊方格在不在左下棋盘if (dr >= tr + s && dc < tc + s){chessBoard(tr + s, tc, dr, dc, s);}else{board[tr + s][tc + s - 1] = t;chessBoard(tr + s, tc, tr + s, tc + s - 1, s);}// 判断特殊方格在不在右下棋盘if (dr >= tr + s && dc >= tc + s){chessBoard(tr + s, tc + s, dr, dc, s);}else{board[tr + s][tc + s] = t;chessBoard(tr + s, tc + s, tr + s, tc + s, s);}
}int main()
{int boardSize = 8; // 棋盘边长chessBoard(0, 0, 3, 3, boardSize); // (0, 0)为顶点,大小为boardSize的棋盘; 特殊方块位于(3, 3)// 打印棋盘int i, j;printf("\n\n\n");for (i = 0; i < boardSize; i++){for (j = 0; j < boardSize; j++) {printf("%d\t", board[i][j]); }printf("\n\n\n"); }return 0;
}
数字螺旋矩阵
#include <cstdio>const int MAXN = 25;
int a[MAXN][MAXN], idx = 1;void genMatrix(int n, int x, int y) {if (n == 0) {return;} else if (n == 1) {a[x][y] = idx++;} else {for (int j = y; j < y + n - 1; j++) {a[x][j] = idx++;}for (int i = x; i < x + n - 1; i++) {a[i][y + n - 1] = idx++;}for (int j = y + n - 1; j > y; j--) {a[x + n - 1][j] = idx++;}for (int i = x + n - 1; i > x; i--) {a[i][y] = idx++;}genMatrix(n - 2, x + 1, y + 1);}
}int main() { int n; scanf("%d", &n); genMatrix(n, 0, 0); for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { printf("%d", a[i][j]); printf(j < n - 1 ? " " : "\n"); }}return 0;
}
盒分形
#include <cstdio>
#include <cmath>
#include <cstring>const int MAXN = 3 * 3 * 3 * 3 * 3 * 3;
char mp[MAXN][MAXN];void f(int n, int x, int y) {if (n == 1) {mp[x][y] = 'X';} else {int unit = (int)pow(3.0, n - 2);f(n - 1, x, y);f(n - 1, x, y + 2 * unit);f(n - 1, x + unit, y + unit);f(n - 1, x + 2 * unit, y);f(n - 1, x + 2 * unit, y + 2 * unit);}
}int main() {int n;scanf("%d", &n);memset(mp, ' ', sizeof(mp));f(n, 0, 0);int edge = (int)pow(3.0, n - 1);for (int i = 0; i < edge; i++) {for (int j = 0; j < edge; j++) {printf("%c", mp[i][j]);}printf("\n");}return 0;
}