递归
- 一、递归
- 1. 意义
- 2. 要素
- 二、典型例题
- 1. 全排列
- 2. 数字组合
- 三、例题
- 1. 素数环
- 2. 素数环变形
一、递归
1. 意义
递归算法: 一种函数不断调用自身来解决更小规模问题的算法,直到达到基本情况或结束条件。递归可以将复杂的问题分解成更小的子问题,从而简化解决方案。
2. 要素
- 边界: 没有了边界就会一直进行死循环。
- 向边界靠近: 不靠近边界也会一直进行死循环。
二、典型例题
1. 全排列
#include <iostream>
using namespace std;int n;
int a[10];
bool used[10];void dfs(int step) {if (step > n) {for (int i = 1; i <= n; i++) {cout << a[i] << " ";}cout << endl;return;}for (int i = 1; i <= n; i++) {if (used[i] == 0) {a[step] = i;used[i] = 1;dfs(step+1);used[i] = 0;}}
}int main() {cin >> n;dfs(1);return 0;
}
2. 数字组合
#include <iostream>
using namespace std;int n, m;
int a[15];
bool used[15];void dfs(int step, int last) {if (step > m) {for (int i = 1; i <= m; i++) {cout << a[i] << " ";}cout << endl;return;}for (int i = last+1; i <= n; i++) {if (used[i] == 0) {a[step] = i;used[i] = 1;dfs(step+1, i);used[i] = 0;}}
}int main() {cin >> n >> m;dfs(1, 0);return 0;
}
三、例题
1. 素数环
#include <iostream>
using namespace std;int n, cnt;
int a[20];
bool vis[20];bool isPrime(int x) {if (x <= 1) return 0;for (int i = 2; i * i <= x; i++)if (x % i == 0)return 0;return 1;
}void dfs(int step) {if (step > n && isPrime(a[1]+a[n])) {for (int i = 1; i <= n; i++)cout << a[i] << " ";cnt++;cout << endl;return;}for (int i = 1; i <= n; i++) {if (vis[i] == 0 && (step == 1 || isPrime(i+a[step-1]))) {a[step] = i;vis[i] = 1;dfs(step+1);vis[i] = 0;}}
}int main() {cin >> n;dfs(1);cout << cnt;return 0;
}
2. 素数环变形
从电脑输入 n n n 个正整数,求这个 n n n 个乱序的正整数,能组成多少个素数环的形式,输入的所有数在每组素数环情况中都要用到。
#include <iostream>
#include <algorithm>
using namespace std;int cnt, n, p[20], a[20];
bool vis[20];bool isPrime(int x) {if (x <= 1) return false;for (int i = 2; i * i <= x; i++)if (x % i == 0)return false;return true;
}void dfs(int step) {if (step == n+1) {if (!isPrime(a[1]+a[n])) return;for (int i = 1; i <= n; i++)cout << a[i] << " ";cnt++;cout << endl;return;}for (int i = 1; i <= n; i++) {if (!vis[i]) {if (step==1 || isPrime(a[step-1]+p[i])) {a[step] = p[i];vis[i] = true;dfs(step+1);vis[i] = false;}}}
}int main() {cin >> n;for (int i = 1; i <= n; i++)cin >> p[i];sort(p+1,p+n+1);dfs(1);cout << cnt;return 0;
}