《仨》 简单算法--1.递归-上

123 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

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)递归实现指数型枚举

www.acwing.com/problem/con…

从 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();
     }
 ​
 }

\