递归与递推

本文探讨了四种不同的编程示例,分别涉及递归、回溯、斐波那契数列和二维矩阵操作。通过Java实现,展示了递归在不同场景下的应用,包括全排列生成、斐波那契数列计算以及解决棋盘翻转问题。这些实例深入浅出地解释了递归和递推的概念,并提供了实际的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

递归与递推

在这里插入图片描述

import java.util.Scanner;

public class Main {
	
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		for (int i = 0; i < 1 << n; i ++) {
			for (int j = 0; j < n; j ++) {
				if ((i >> j & 1) == 1) {
					System.out.print(j + 1 + " ");
				}
			}
			System.out.println();
		}
	}

}

在这里插入图片描述

import java.util.Scanner;

public class Main {
	
	static int n, cnt = 0;
	static int[] num = new int[10];
	static boolean[] vis = new boolean[10];
	
	static void dfs(int x) {
		if (x == n + 1) {
			for (int i = 1; i <= n; i ++) {
				System.out.print(num[i] + " ");
			}
			System.out.println();
		}
		for (int i = 1; i <= n; i ++) {
			if (!vis[i]) {
				num[x] = i;
				vis[i] = true;
				dfs(x + 1);
				vis[i] = false;
			}
		}
	}
	
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		n= in.nextInt();
		dfs(1);
	}

}

在这里插入图片描述

import java.util.Scanner;

public class Main {
	
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		long a = 0, b = 1, c;
		System.out.print(a);
		for (int i = 1; i < n; i ++) {
			c = a + b;
			a = b;
			b = c;
			System.out.print(" " + a);
		}
	}

}

在这里插入图片描述

import java.util.Scanner;

public class Main {
	
	static char[][] g = new char[10][10];
	static int[] dx = new int[]{0, -1, 0, 1, 0};
	static int[] dy = new int[]{0, 0, 1, 0, -1};
	
	static void turn(int x, int y) {
		for (int i = 0; i < 5; i ++) {
			int tx = x + dx[i];
			int ty = y + dy[i];
			if (tx >= 0 && tx < 5 && ty >= 0 && ty < 5) {
				g[tx][ty] ^= 1;
			}
		}
	}
	
	static int Task() {
		int ans = 0x3f3f3f3f;
		for (int i = 0; i < 1 << 5; i ++) {
			int res = 0;
			char[][] tmp = new char[10][10];
			for (int j = 0; j < 5; j ++) {
				for (int k = 0; k < 5; k ++) {
					tmp[j][k] = g[j][k];
				}
			}
			for (int j = 0; j < 5; j ++) {
				if ((i >> j & 1) == 1) {
					res ++;
					turn(0, j);
				}
			}
			for (int j = 0; j < 4; j ++) {
				for (int k = 0; k < 5; k ++) {
					if (g[j][k] == '0') {
						res ++;
						turn(j + 1, k);
					}
				}
			}
			boolean flag = true;
			for (int j = 0; j < 5; j ++) {
				if (g[4][j] == '0') {
					flag = false;
					break;
				}
			}
			if (flag) ans = Math.min(ans, res);
			for (int j = 0; j < 5; j ++) {
				for (int k = 0; k < 5; k ++) {
					g[j][k] = tmp[j][k];
				}
			}

		}
		if (ans > 6) ans = -1;
		return ans;
	}
	
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int T = in.nextInt();
		while (T -- > 0) {
			in.nextLine();
			for (int i = 0; i < 5; i ++) {
				g[i] = in.next().toCharArray();
			}
			System.out.println(Task());
		}
		
	}
	
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值