本文已参与「新人创作礼」活动,一起开启掘金创作之路
1.递归
递归就是一个函数调用自身,但是需要确定一个题目的递归式,
一个完整的递归函数包含两个部分
(1)递归式
(2)递归出口
通过斐波那契数列为例
int f(int n){
if(n == 1 || n == 2 ) return 1;
return f(n-1) + f(n-2);
}
(1)通过递归实现行列式的计算(蓝桥杯)
问题描述
//据说很多人的题目会有一大堆废话,本傻×就不在这里废话了。 给定一个N×N的矩阵A,求|A|。
输入格式
第一行一个正整数N。 接下来N行,每行N个整数,第i行第j个数字表示Ai。
输出格式
一行,输出|A|。
样例输入
2 1 2 3 4
样例输出
-2
数据规模和约定
0<N≤6 -10≤Ai≤10
import java.io.*;
import java.util.*;
public class Main{
static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
public static void minor(int[][] a,int[][] A,int x,int n) {
for(int i = 1; i < n; ++i) {
for(int j = 0, y = 0; j < n; ++j) {
if(j != x) {
a[i - 1][y++] = A[i][j];
}
}
}
}
public static int F(int [][] A,int n) {
if(n == 1) return A[0][0];
else if (n == 2) return A[0][0] * A[1][1] - A[0][1] * A[1][0];
int ans = 0;
int a[][] = new int[n-1][n-1];
for(int i = 0; i < n; ++i) {
minor(a,A,i,n);
ans += Math.pow(-1, i) * F(a,n-1) * A[0][i];
}
return ans;
}
public static void main(String[] args) throws Exception{
int n = Integer.parseInt(in.readLine());
int[][] arr = new int[n][n];
for(int i = 0; i < n; ++i) {
String[] str = in.readLine().split(" ");
for(int j = 0; j < n; ++j) {
arr[i][j] = Integer.parseInt(str[j]);
}
}
out.write(F(arr,n) + "\n");
out.close();
in.close();
}
}
(2)递归实现指数型枚举
从 1∼n1∼n 这 nn 个整数中随机选取任意多个,输出所有可能的选择方案。
输入格式
输入一个整数 nn。
输出格式
每行输出一种方案。
同一行内的数必须升序排列,相邻两个数用恰好 11 个空格隔开。
对于没有选任何数的方案,输出空行。
本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。
数据范围
1≤n≤151≤n≤15
输入样例:
3
输出样例:
3
2
2 3
1
1 3
1 2
1 2 3
通过递归来实现指数型枚举的主要思想,就是当前数字是否保留,即要不要当前这个数字,如 n = 5,从1开始,保留1,或者不保留,从1进入2,2保留或者不保留,这就形成了一个树型结构了。代码如下
import java.io.*;
import java.util.*;
public class Main{
static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
static int n = 0;
static void dfs(int deep,int status) throws IOException{
if(deep == n) {
for(int i = 0; i < n; ++i) {
if((status >> i & 1) == 1) {
out.write(i + 1 + " ");
}
}
out.write("\n");
return ;
}
dfs(deep + 1,status);
dfs(deep + 1,status | 1 << deep);
}
public static void main(String[] args) throws Exception{
n = Integer.parseInt(in.readLine());
dfs(0,0);
in.close();
out.close();
}
}
\