面试中常见的算法之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);

    }

}

  

原文地址:https://www.cnblogs.com/qianjinyan/p/11162348.html

时间: 2024-07-31 20:36:14

面试中常见的算法之Java中的递归的相关文章

转- 关于时间,日期,星期,月份的算法(Java中Calendar的使用方法)

package cn.outofmemory.codes.Date; import java.util.Calendar; import java.util.Date; public class CalendarDemo { public static void main(String[] args) { Calendar calendar=Calendar.getInstance(); calendar.setTime(new Date()); System.out.println("现在时间

关于时间,日期,星期,月份的算法(Java中Calendar的使用方法)(一)

package cn.outofmemory.codes.Date; import java.util.Calendar; import java.util.Date; public class CalendarDemo { public static void main(String[] args) { Calendar calendar=Calendar.getInstance(); calendar.setTime(new Date()); System.out.println("现在时间

关于时间,日期,星期,月份的算法(Java中Calendar的用法)(一)

package cn.outofmemory.codes.Date; import java.util.Calendar; import java.util.Date; public class CalendarDemo { public static void main(String[] args) { Calendar calendar=Calendar.getInstance(); calendar.setTime(new Date()); System.out.println("如今时间

常见排序算法总结(java实现)

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.常见的排序算法有选择排序,插入排序,希尔排序,归并排序和快速排序 由于在排序的过程中不可避免的要涉及到比较和交换,所以将他们抽取为两个单独的函数,如下所示 //为了排序代码的通用性,这里假定待排序的元素实现了Comparable接口 private static boolean less(Comparable v ,Comparable w){ return v.compareTo(w)<0; } priva

iOS面试中常见的算法题目

一.前言 这里是在iOS求职中自己遇到的算法题,希望对大家有所帮助.不定期更新.如果大家想在线运行代码调试,可以将代码拷贝到这里.然后进行调试.下面就是常见的算法题目. 二.正文 1.就n的阶乘. 思路:这里面用递归实现 #include <stdio.h> int getNJ(int n) { if (n==1 || n==0) { return 1; } return n*getNJ(n-1); } int main() { printf("%d",getNJ(10))

c#中泛型集合directory和java中map集合对比

c#中directory的基本用法1.创建及初始化 Dictionary<int, string> myDictionary = new Dictionary<int, string>(); 2.添加元素 myDictionary.Add("C#",0); myDictionary.Add("C++",1); myDictionary.Add("C",2); myDictionary.Add("VB",

c#中的里氏转换和Java中强制类型转换在多态中的应用

在c#中: 注意: 子类并没有继承父类的构造函数,而是会默认调用父类那个无参数的构造函数. 如果一个子类继承了一个父类,那么这个子类除了可以使用自己的成员外,还可以使用从父类那里继承过来的成员.但是父类永远都只能使用自己的成员,而不能使用子类的成员. 子类之间也不能互相使用对方的成员. 里氏转换的概念: 1).子类可以赋值给父类 2).如果父类中装的是子类对象,那么可以讲这个父类强转为子类对象. namespace 里氏转换_接口练习 { class Program { static void

常见排序算法(java实现)

常见排序算法介绍 冒泡排序 代码: public class BubbleSort { public static void sort(int[] array) { int tValue; for (int i = 0; i < array.length; i++) { for (int j = i; j < array.length; j++) { if (array[i] > array[j]) { tValue = array[i]; array[i] = array[j]; ar

Spark-Mllib中各分类算法的java实现(简易教程)

一.简述 Spark是当下非常流行的数据分析框架,而其中的机器学习包Mllib也是其诸多亮点之一,相信很多人也像我那样想要快些上手spark.下面我将列出实现mllib分类的简明代码,代码中将简述训练集和样本集的结构,以及各分类算法的参数含义.分类模型包括朴素贝叶斯,SVM,决策树以及随机森林. 二.实现代码 import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaRDD; import org.apache