最简单的递归(Java实现)

本文深入探讨了递归算法的应用,包括数字打印、阶乘计算、数列求和、数字求和及斐波那契数列的实现。通过具体示例,如打印1234、计算5的阶乘、求1到10的和、计算1234各位数字之和以及生成斐波那契数列,展示了递归算法在解决数学问题上的强大能力。
public class printNum {
    public static void printDigit(int num){//输入1234,输出1 2 3 4
        if(num<10){
            System.out.println(num);
        }
        else{
            printDigit(num/10);
            //1234 123digit(1234)12-digit(123) 1-digit(12)
            System.out.println(num%10);
        }

    }
    public static int factoral(int num){//求9*8*7*6*5*4*3*2*1
        if(num<=1){
            return 1;
        }
        //9*factoral(9-1)  8*factoral(8-1) 7*factoral(7-1)
        else return num*factoral(num-1);
    }
    
    public static int sumNum(int num){//求10+9+8+7+6……+1
        if(num==1){
            return 1;
        }
        else{
            return num+sumNum(num-1);//10+sum(10-1)  9+sum(9-1)  
        }
    }
    
    public static int digitSum(int num){//输入1234 输出1+2+3+4
        if(num==1){
            return 1;
        }
        else 
        //1234  4+digit(123) 3+digit(12)
            return num%10+digitSum(num/10);
    }
    public static int Fib(int num){
        if(num==1||num==2){
            return 1;
        }
        else {
            return Fib(num-1)+Fib(num-2);
        }
    }
    public static void main(String[] args) {
        System.out.println(factoral(5));
    }
}
### 关于Java实现暴力递归算法 暴力递归是一种常见的解决问题的方法,它通常会尝试所有可能的情况并从中找出最优解或满足条件的解。这种方法虽然简单直观,但在处理大规模数据时可能会面临性能瓶颈。以下是基于提供的引用内容以及相关知识构建的一个具体示例。 #### 暴力递归的核心特点 暴力递归的关键在于将问题分解为更小的子问题,并通过递归来逐一求解这些子问题。需要注意的是,暴力递归并不存储中间结果,因此可能导致大量的重复计算[^2]。 #### 使用Java实现暴力递归的例子:0-1背包问题 以下是一个经典的0-1背包问题的暴力递归实现: ```java public class KnapsackProblem { public static int knapSack(int W, int[] wt, int[] val, int n) { // Base Case: 如果没有物品或者背包容量为0,则返回0 if (n == 0 || W == 0) { return 0; } // 如果当前物品重量大于背包剩余容量,则跳过该物品 if (wt[n - 1] > W) { return knapSack(W, wt, val, n - 1); } else { // 取两种情况的最大值: // 1. 不选第n个物品 // 2. 选第n个物品 return Math.max( knapSack(W, wt, val, n - 1), val[n - 1] + knapSack(W - wt[n - 1], wt, val, n - 1) ); } } public static void main(String[] args) { int[] val = {60, 100, 120}; // 物品价值 int[] wt = {10, 20, 30}; // 物品重量 int W = 50; // 背包最大承重 int n = val.length; System.out.println("Maximum value obtained with the given weights is " + knapSack(W, wt, val, n)); } } ``` 上述代码展示了如何利用暴力递归解决0-1背包问题。对于每个物品,程序都会考虑两种可能性——放入背包或不放入背包,并最终选取能获得最大价值的选择[^1]。 #### 骑士巡游问题的暴力递归实现一个典型的例子是骑士巡游问题(Knight's Tour Problem),其中可以使用暴力递归来寻找解决方案。以下是一个简单的实现: ```java import java.util.ArrayList; public class KnightsTour { private static final int N = 8; // 棋盘大小 private static ArrayList<Integer> result = new ArrayList<>(); public static boolean solveKTUtil(int x, int y, int movei, int sol[][], int xMove[], int yMove[]) { if (movei == N * N) { return true; } for (int k = 0; k < 8; k++) { int next_x = x + xMove[k]; int next_y = y + yMove[k]; if (isSafe(next_x, next_y, sol)) { sol[next_x][next_y] = movei; if (solveKTUtil(next_x, next_y, movei + 1, sol, xMove, yMove)) { return true; } else { sol[next_x][next_y] = -1; // Backtracking } } } return false; } public static boolean isSafe(int x, int y, int sol[][]) { return (x >= 0 && x < N && y >= 0 && y < N && sol[x][y] == -1); } public static void solve() { int sol[][] = new int[N][N]; /* Initialization of solution matrix */ for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) sol[i][j] = -1; /* x and y moves based on Knight's tour */ int xMove[] = {2, 1, -1, -2, -2, -1, 1, 2}; int yMove[] = {1, 2, 2, 1, -1, -2, -2, -1}; sol[0][0] = 0; // Starting point if (!solveKTUtil(0, 0, 1, sol, xMove, yMove)) System.out.println("Solution does not exist"); else printSolution(sol); } public static void printSolution(int sol[][]) { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) System.out.print(sol[i][j] + " "); System.out.println(); } } public static void main(String[] args) { solve(); } } ``` 此代码实现了骑士在国际象棋棋盘上的移动路径搜索,采用暴力递归的方式穷举每一种可能的路径组合[^3]。 --- ### 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值