首页 > 编程语言 >Java - 13 方法的递归

Java - 13 方法的递归

时间:2024-10-06 15:44:39浏览次数:1  
标签:13 Java 递归 int System class num public out

Java - 13 方法的递归

递归必须向退出递归的条件逼近

斐波那契数列

  1. 当n=1,1
  2. 当n=2,1
  3. 当n >= 3,是前两个数的和
public class Recursion{
	public static void main(String[] args) {
		Fbnq f = new Fbnq();
		int n = 7;
		int res = f.num(n);
		if(res!=-1)
			System.out.println(res);
	}
}

class Fbnq {
	public int num(int n){
		if(n<1){
			System.out.println("text the number >= 1");
			return -1;			
		}else{
			if(n > 2)
				return num(n-1)+num(n-2);
			else
				return 1;
		}
	}
}
  • 考虑无效输入的情况,返回-1,用-1控制输出

猴子吃桃

  1. 第10天,1个桃子
  2. 第9天,(1+1)*2个桃子
public class Recursion{
	public static void main(String[] args) {
		Monkey m = new Monkey();
		int res = m.peach(9);
		if (res!=-1)
			System.out.println(res);
	}
}

class Monkey {
	public int peach(int n){
		if(n == 10){
			return 1;
		}else if(n>=1&&n<=9){
			return (peach(n+1)+1)*2;
		}else{
			System.out.println("1-10");
			return -1;
		}
	}
}

迷宫

public class Migong{
	public static void main(String[] args) {
		// draw map
		int[][] map = new int[8][7];
		for(int i = 0; i<map[i].length; i++){
			map[0][i] = 1;
			map[7][i] = 1;
		}
		for(int i = 0; i<map.length; i++){
			map[i][0] = 1;
			map[i][6] = 1;
		}
		map[3][1] = 1;
		map[3][2] = 1;
		map[2][2] = 1;
		for(int i = 0; i<map.length; i++){
			for(int j = 0; j<map[i].length; j++){
				System.out.print(map[i][j]+" ");
			}
			System.out.println("");
		}

		// find way
		Migong m = new Migong();
		m.findWay(map, 1, 1);

		System.out.println("============");

		// check the map
		for(int i = 0; i<map.length; i++){
			for(int j = 0; j<map[i].length; j++){
				System.out.print(map[i][j]+" ");
			}
			System.out.println("");
		}
	}
}

class Migong {
	/* 1: barrier 2: can pass 3: cant pass */
	public boolean findWay(int[][] map, int i, int j){
		if(map[6][5] == 2)
			return true;
		else if(map[i][j] == 0){
			map[i][j] = 2; // assume it can go through
			// go down
			if(findWay(map, i+1, j))
				return true;
			// go right
			else if(findWay(map, i, j+1))
				return true;
			// go up
			else if(findWay(map, i-1, j))
				return true;
			// go left
			else if(findWay(map, i, j-1))
				return true;
			else{
				map[i][j] = 3;
				return false;
			}
		}else{
			return false;
		}
	}
}

Hanoi

public class Hanoi{
	public static void main(String[] args) {
		Hanoi tower = new Hanoi();
		tower.move(5,'A','C','B');
	}
}

class Hanoi {
	public void move(int num, char from, char to, char help){
		if(num == 1)
			System.out.println(from + "->" + to);
		else{
			move(num-1, from, help, to);
			System.out.println(from + "->" + to);
			move(num-1, help, to, from);
		}
	}
}

八皇后

import java.util.ArrayList;
import java.util.List;
public class Try{
    public static void main(String[] args) {
        int n = 8;
        Solution s = new Solution();
        s.solveNQueens(n);
    }
}
class Solution {
    public void solveNQueens(int n) {
        int count = 0;
        int[] solve = new int[n];
        for(int i = 0; i<n; i++){
            solve[i] = -1;
        }
        List<int[]> solves = new ArrayList<>();
        findQ(n, 0, solve, solves);
            // 遍历 List
            for (int[] array : solves) {
                count++;
                System.out.print("solution: ");
                for (int num : array) {
                    System.out.print(num + " ");
                }
                System.out.println();
            }
        System.out.println(count); // 一共解法

    }

    public void findQ(int n, int row, int[] solve, List<int[]> solves){ // n:一共的行数(8); row:当前的行数(0-7); solve
        for(int i = 0; i<n; i++){
            if(row == n){ // 最后一行已经下好Q了
                solves.add(solve.clone()); // *
                return ;
            }else{
                solve[row] = i; // 假设下在第row+1行的i+1个位置
                if(isValid(solve, row))
                    findQ(n, row+1, solve, solves); // 继续找下一行
                solve[row] = -1; // 回溯
            }    
        }

    }

    public boolean isValid(int[] sol, int row){
        boolean flag1;
        boolean flag2;
        boolean flag3;

        for(int n = 0; n<row ; n++){
            for(int m = n+1; m<=row; m++){
                flag1 = sol[n] == sol[m]; // 在同一列
                flag2 = (n - sol[n]) == (m - sol[m]); // 在左上\右下
                flag3 = (n + sol[n]) == (m + sol[m]); // 在左下\右上
                if(flag1 || flag2 || flag3)
                    return false;
            }
        }
        return true;
    }    

}

标签:13,Java,递归,int,System,class,num,public,out
From: https://www.cnblogs.com/wxrwajiez/p/18449104

相关文章

  • Java - 15 作用域
    Java-15作用域classCat{ intage=1;//全局变量(属性),作用域是整个cat类{intnum=100;//代码块中-局部变量}publicvoidsay(){ Stringgreet="hello";//局部变量(除了属性之外就是局部变量),只能在say方法中使用System.out.p......
  • Java - 3 运算符
    Java-3运算符算术运算符/*++a:先运算后取值a++:先取值后运算*/inti=1;i=i++;//(1)temp=i;(2)i=i+1;(3)i=temp;System.out.println(i);//1inti=1;i=++i;//(1)i=i+1;(2)temp=i;(3)i=temp;System.out.println(i);//2System.out.prin......
  • 20222413 2024-2025-1 《网络与系统攻防技术》实验一实验报告
    1.实验内容在本周的学习过程中,我了解到了许多缓冲区溢出攻击的实际案例、缓冲区溢出攻击的原理和相关基础知识,包括GDB调试器的使用方法、反汇编、基础的汇编语言与指令等,重新温习了函数调用过程和进程管理方面的知识内容。并且通过实验一,我能够了解并熟练完成Linux系统实验相关的......
  • Java - 5 原码、反码、补码
    Java-5原码、反码、补码0表示正,1表示负整数的原码,反码,补码都一样负数的反码=原码符号位不变,其它位取反负数的补码=反码+10的反码,补码都是0Java中没有无符号数计算机运算时,以补码的方式运算看计算结果时,要看原码整数数据类型取值范围数据类型范围byt......
  • 陀螺仪LSM6DSV16X与AI集成(13)----中断获取SFLP四元数
    陀螺仪LSM6DSV16X与AI集成.13--中断获取SFLP四元数概述视频教学样品申请源码下载硬件准备SFLP开启INT中断中断读取传感器数据主程序演示概述本文将介绍如何通过中断机制获取LSM6DSV16X传感器的SFLP(SensorFusionLowPower)四元数数据。LSM6DSV16X是一款高性能的......
  • 2024-2025-1 20241329 《计算机基础与程序设计》第二周学习总结
    作业信息作业归属课程:https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP作业要求:https://www.cnblogs.com/rocedu/p/9577842.html#WEEK02作业目标:1.数字化2.信息安全3.自学教材:计算机科学概论(第七版)第1章并完成云班课测试、《C语言程序设计》第1章并完成云班课测试作......
  • 信息学奥赛复赛复习13-CSP-J2021-02插入排序-排序稳定性、插入排序、sort排序、结构体
    PDF文档公众号回复关键字:202410061P7910[CSP-J2021]插入排序[题目描述]插入排序是一种非常常见且简单的排序算法。小Z是一名大一的新生,今天H老师刚刚在上课的时候讲了插入排序算法。假设比较两个元素的时间为O(1),则插入排序可以以O(n^2)的时间复杂度完成长度为......
  • 2024-2025-1 20241311 《计算机基础与程序设计》第二周学习总结
    学期(2024-2025-1)学号(20241311)《计算机基础与程序设计》第2周学习总结作业信息这个作业属于哪个课程<班级的链接>(2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2024-2025-1计算机基础与程序设计第二周作业)这个作业的目标<写上具体方......
  • 递归_字符串匹配,最长连续序列
    1:字符串匹配题目链接:LCR137.模糊搜索验证-力扣(LeetCode)可以使用递归的方法来检查 input 是否可以匹配 article。目的是正确处理两种通配符:‘.’和‘*’的匹配规则。defis_match(article:str,input:str)->bool:ifnotinput:returnnotarticle......
  • Java内存模型
    1.硬件的效率与一致性物理机遇到的并发问题与虚拟机中的情况有很多相似之处,物理机对并发的处理方案对虚拟机的实现也有相当大的参考意义。“让计算机并发执行若干个运算任务”与“更充分地利用计算机处理器的效能”之间的因果关系,看起来理所当然,实际上它们之间的关系并没有想象......