面试中常见的算法之Java中的递归

Posted qianjinyan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试中常见的算法之Java中的递归相关的知识,希望对你有一定的参考价值。

1、方法定义中调用方法本身的现象
2、递归注意实现
1) 要有出口,否则就是死递归
2) 次数不能太多,否则就内存溢出
3) 构造方法不能递归使用
3、递归解决问题的思想和图解:

分解和合并【先分解后合并】


1. 常见的斐波那契数列

1,1,2,3,5,8,13,21,...
特征: 从第三个数开始,每个数是前两个数的和。

int count = 0;

    private int getFibo(int i) 

        if (i == 1 || i == 2) 
            count = count+1;
            System.out.println("第" +count+"次进行运算  并返回结果1" );
            return 1;
        else
        
            count = count+1;
            System.out.println("第" +count+"次进行运算  "+ "getFibo("+(i - 1)+")"+" + getFibo("+(i - 2)+")");
            return getFibo(i - 1) + getFibo(i - 2);
        
    


    @Test
    public void test01() 
       int value =  getFibo(6);
        System.out.println(value);
    

 技术图片技术图片

 技术图片

 

 

 

 

2. 阶乘
10!= 10 * 9 * 8 * 7 * (... )* 1
9! = 9 * 8 * 7 * (... )* 1
8! = 8 * 7 * (... )* 1
特征:
9!=9* 8!
10! =10 * 9!

 

//阶乘
    private int get(int i)
        int result = 1;
        if (i == 1) 
            count = count+1;
            System.out.println("第" +count+"次进行运算  并返回结果* 1" );
            result = result * 1;
        
        else 
            count = count+1;
            System.out.println("第" +count+"次进行运算" + "get(" +(i-1)+")" );
            result = i * get(i-1);
        
        return result;

    



    @Test
    public void test01() 
        //System.out.println(getFibo(6));
        System.out.println(get(5));
    

 

  技术图片技术图片

 

 

 

3. 加法实现1+2+3+4+5+...+100=

 

 //求和
    private int fsum(int i)

        if (i <= 0) 
            count = count+1;
            System.out.println("第" +count+"次进行运算并返回0" );
            return 0;
        
        else 
            count = count+1;
            System.out.println("第" +count+"次进行运算且返回 " + i +" + fsum(" +(i-1)+")" );
            return (i + fsum(i-1));

        


    





    @Test
    public void test01() 
        //System.out.println(getFibo(6));
        //System.out.println(get(5));
        System.out.println(fsum(10));

    

 

  

 4. 实现打印乘法表

//打印乘法表
    //for 循环实现
    private void getByFor(int n) 
        for (int i = 1; i <= n; i++) 
            for (int j = 1; j <= i; j++) 
                System.out.print(i+" * "+j+" = "+i*j+"  ");
            
            System.out.println();
        
    
    //打印乘法表
    //递归实现
    public static void getByRecursion(int n) //递归 实现
        if (n == 1) 
            System.out.println("1 * 1 = 1 ");
        
        else 
            getByRecursion(n-1);
            for (int j = 1; j <= n; j++) 
                System.out.print(n+" * "+j+" = "+n*j+"  ");
            
            System.out.println();
        
    





    @Test
    public void test01() 
        //System.out.println(getFibo(6));
        //System.out.println(get(5));
        //System.out.println(fsum(10));

        getByFor(8);
        getByRecursion(9);

    

  

 6. 汉诺塔游戏

三根木棒,n个依次增大的空心圈圈,每次移动一个圈圈到木棒上,且任何时候保证小的圈圈不能被大的圈圈压在下面。

2的n次方-1

技术图片

 

 

//5. 汉诺塔(又称河内塔)问题其实是印度的一个古老的传说
    public int hanio(int n,char a,char b,char c) 
        if (n == 1) 
            System.out.println( n + "号盘子从" + a + "到" + c);
            count = count+1;
            return count;

         else 
            count = count+1;
            hanio(n - 1, a, c, b);//把上面n-1个盘子从a借助b搬到c
            System.out.println("移动" + n + "号盘子从" + a + "到" + c);//紧接着直接把n搬动c
            hanio(n - 1, b, a, c);//再把b上的n-1个盘子借助a搬到c
            return count;
        

    



    @Test
    public void test01() 
        //System.out.println(getFibo(6));
        //System.out.println(get(5));
        //System.out.println(fsum(10));

        //getByFor(8);
        //getByRecursion(9);

        int count =hanio(3,‘A‘,‘B‘,‘C‘);
        System.out.println(count);

    

 

  

 

 

代码:

package com.example.demo;

import org.junit.Test;

public class Test02 

    int count = 0;

    //1. 斐波那契数列递归,用的时候请将count和输出System.Out去除
    private int getFibo(int i) 

        if (i == 1 || i == 2) 
            count = count+1;
            System.out.println("第" +count+"次进行运算  并返回结果1" );
            return 1;
        else
        
            count = count+1;
            System.out.println("第" +count+"次进行运算  "+ "getFibo("+(i - 1)+")"+" + getFibo("+(i - 2)+")");
            return getFibo(i - 1) + getFibo(i - 2);
        
    

    //2. 阶乘
    private int get(int i)
        int result = 1;
        if (i == 1) 
            count = count+1;
            System.out.println("第" +count+"次进行运算并返回result * 1" );
            result = result * 1;
        
        else 
            count = count+1;
            System.out.println("第" +count+"次进行运算且返回 " + i+" * get(" +(i-1)+")" );
            result = i * get(i-1);
        
        return result;

    

    //3. 求和
    private int fsum(int i)

        if (i <= 0) 
            count = count+1;
            System.out.println("第" +count+"次进行运算并返回0" );
            return 0;
        
        else 
            count = count+1;
            System.out.println("第" +count+"次进行运算且返回 " + i +" + fsum(" +(i-1)+")" );
            return (i + fsum(i-1));

        
    

    //打印乘法表
    //for 循环实现
    private void getByFor(int n) 
        for (int i = 1; i <= n; i++) 
            for (int j = 1; j <= i; j++) 
                System.out.print(i+" * "+j+" = "+i*j+"  ");
            
            System.out.println();
        
    
    //打印乘法表
    //4. 递归实现
    public void getByRecursion(int n) //递归 实现
        if (n == 1) 
            System.out.println("1 * 1 = 1 ");
        
        else 
            getByRecursion(n-1);
            for (int j = 1; j <= n; j++) 
                System.out.print(n+" * "+j+" = "+n*j+"  ");
            
            System.out.println();
        
    

    //5. 汉诺塔(又称河内塔)问题其实是印度的一个古老的传说
    public int hanio(int n,char a,char b,char c) 
        if (n == 1) 
            System.out.println( n + "号盘子从" + a + "到" + c);
            count = count+1;
            return count;

         else 
            count = count+1;
            hanio(n - 1, a, c, b);//把上面n-1个盘子从a借助b搬到c
            System.out.println("移动" + n + "号盘子从" + a + "到" + c);//紧接着直接把n搬动c
            hanio(n - 1, b, a, c);//再把b上的n-1个盘子借助a搬到c
            return count;
        

    



    @Test
    public void test01() 
        //System.out.println(getFibo(6));
        //System.out.println(get(5));
        //System.out.println(fsum(10));

        //getByFor(8);
        //getByRecursion(9);

        int count =hanio(3,‘A‘,‘B‘,‘C‘);
        System.out.println(count);

    


  

 

package com.example.demo;

import org.junit.Test;

public class Test03 

    int count = 0;

    //1. 斐波那契数列递归,用的时候请将count和输出System.Out去除
    private int getFibo(int i) 

        if (i == 1 || i == 2) 
            return 1;
        else
        
           return getFibo(i - 1) + getFibo(i - 2);
        
    

    //2. 阶乘
    private int get(int i)
        int result = 1;
        if (i == 1) 
            result = result * 1;
        
        else 
            result = i * get(i-1);
        
        return result;

    

    //3. 求和
    private int fsum(int i)

        if (i <= 0) 
            return 0;
        
        else 
           return (i + fsum(i-1));

        
    

    //打印乘法表
    //for 循环实现
    private void getByFor(int n) 
        for (int i = 1; i <= n; i++) 
            for (int j = 1; j <= i; j++) 
                System.out.print(i+" * "+j+" = "+i*j+"  ");
            
            System.out.println();
        
    
    //打印乘法表
    //4. 递归实现
    public void getByRecursion(int n) //递归 实现
        if (n == 1) 
            System.out.println("1 * 1 = 1 ");
        
        else 
            getByRecursion(n-1);
            for (int j = 1; j <= n; j++) 
                System.out.print(n+" * "+j+" = "+n*j+"  ");
            
            System.out.println();
        
    

    //5. 汉诺塔(又称河内塔)问题其实是印度的一个古老的传说
    public int hanio(int n,char a,char b,char c) 
        if (n == 1) 
            System.out.println( n + "号盘子从" + a + "到" + c);
            count = count+1;
            return count;

         else 
            count = count+1;
            hanio(n - 1, a, c, b);//把上面n-1个盘子从a借助b搬到c
            System.out.println("移动" + n + "号盘子从" + a + "到" + c);//紧接着直接把n搬动c
            hanio(n - 1, b, a, c);//再把b上的n-1个盘子借助a搬到c
            return count;
        

    



    @Test
    public void test01() 
        System.out.println(getFibo(6));
        System.out.println(get(5));
        System.out.println(fsum(10));

        getByFor(8);
        getByRecursion(8);

        int count =hanio(3,‘A‘,‘B‘,‘C‘);
        System.out.println(count);

    


  

 

 

 

以上是关于面试中常见的算法之Java中的递归的主要内容,如果未能解决你的问题,请参考以下文章

2023-04-19 算法面试中常见的递归和回溯问题

Java面试

常见面试中的算法解法

算法学习笔记之三:八皇后问题(递归回溯)

面试最常见算法1—树—基础篇

面试---算法面试