【Java】递归算法

这篇具有很好参考价值的文章主要介绍了【Java】递归算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


什么是递归?

      程序 调用自身 的编程技巧成为 递归(recursion)

递归算法是一种直接或间接调用、定义自身的函数或方法的算法,也就是调用自身。

递归的实质:将原问题不断分解为规模缩小的子问题,然后用递归调用的方法来表示问题的解;

递归,顾名思义就是 递 和 归 的过程

  • 递:将原问题分解为若干个子问题,这些子问题的解决思路相同;
  • 归:当问题不断递进,需要一个明确结束的递归出口(临界点);

【Java】递归算法,Java学习,数据结构算法之美,java,算法,jvm
      递归算法是一种自下而上的思维,难点在于逻辑性;

需要明确以下几点:

  • 明确递归的终止条件(递归出口);
  • 明确反复执行的递归过程,如何把若干的子问题联系在一起;
  • 给出递归终止时的处理办法;

下面用几个例子来说明:

递归求阶乘

【Java】递归算法,Java学习,数据结构算法之美,java,算法,jvm

  • 这里的递归出口为 0!=1 即 n=0 时 ==1;
  • 递归式子为 n ! = n * ( n - 1 )

用Java写一个递归函数:

 public static int recursion(int n){
     if(n==0){  //递归终止的条件
         return 1;
     }
     return n*recursion(n-1); //递归过程
}
public class Demo01 {
    public static void main(String[] args) {
        int rec;//递归
        int num;//普通
        rec=recursion(5);
        num=fun(5);
        System.out.println("用递归算法得到:"+rec);
        System.out.println("常规循环得到"+num);


    }
    //递归实现
    static int recursion(int n){
        if(n==0){  //递归终止的条件
            return 1;
        }
        return n*recursion(n-1); //递归过程
    }
    //非递归实现
    static int fun(int n){
        int result=1;
        while(n>1){
            result *= n;
            n--;
        }
        return result;
    }
}

【Java】递归算法,Java学习,数据结构算法之美,java,算法,jvm

递归求解斐波那契数列

斐波那契数列:又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13…
在数学上,斐波那契数列有如下以递归形式定义:
F 0 = 0 , F 1 = 1 F_0=0 ,F_1=1 F0=0,F1=1
F n = F ( n − 1 ) + F ( n − 2 ) ( n > = 2 , n ∈ N ∗ ) Fn=F(n-1)+F(n-2) \qquad(n>=2,n\in N* ) Fn=F(n1)+F(n2)(n>=2,nN)
F n = { 0 n = 0 1 n = 1 F n − 1 + F n − 2 n = 2 , 3 , 4 , 5... ( n 为正整数 ) F_n=\begin{cases} 0 & n=0 \\ 1 & n=1 \\ F_{n-1}+F_{n-2} & n=2,3,4,5...(n为正整数) \end{cases} Fn= 01Fn1+Fn2n=0n=1n=2,3,4,5...(n为正整数)

  • 终止条件(递归出口)为 n-1=1 n-2=0 即 n=1或n=2
  • 递归体即 Fn=F(n-1)+F(n-2)
public static int fibonacci(int n){
	if(n==1 || n==2){
	return 1;
	}
	return fibonacci(n-1)+fibonacci(n-2);
}

或:

  • 终止条件 为 n=0 或 n=1 (因为给出了F0和F1的值);
  • 递归体仍为 Fn=F(n-1)+F(n-2)
public static int fibonacci(int n){
    if(n==0){
        return 0;
    }else if(n==1){
        return 1;
    }
    return fibonacci(n-1)+fibonacci(n-2);
}

猴子吃桃问题

【Java】递归算法,Java学习,数据结构算法之美,java,算法,jvm

【Java】递归算法,Java学习,数据结构算法之美,java,算法,jvm

【Java】递归算法,Java学习,数据结构算法之美,java,算法,jvm文章来源地址https://www.toymoban.com/news/detail-544385.html

/*  猴子吃桃问题:小猴子摘了一堆桃子。第一天吃掉一半又多吃了1个,第二天吃了剩下的一半又多吃1个,以后每天都吃掉剩下的一半多一个。第10天发现只剩一个桃子了。问第一天摘了多少桃子?第二天还有多少桃子?第三天……
编写方法peach(int day),计算第day天的桃子数。
在main()方法中输入day(1~10),即你想知道第day天小猴子有多少桃子,调用peach()方法求该天的桃子数。
*/
import java.util.Scanner;
public class Peach {

	public static void main(String[] args) {
		System.out.println("你想知道小猴子第几天的桃子数?请输入(1~10)");
		Scanner sc = new Scanner(System.in);
		int day;
		day = sc.nextInt();
		System.out.printf("第%d天的桃子数是%d\n",day,peach(day));
		sc.close();
	}

	//计算第day天的桃子数
	static int peach(int day) {
		int n;   //n表示第day天的桃子数
		
        if(day==10){
            return 1;
        }
        return 2*(peach(day+1)+1); 
	}
}

到了这里,关于【Java】递归算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构与算法之美 | 栈

    栈结构:后进者先出,先进者后出 栈是一种“操作受限”的线性表 当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,这时我们就应该首选“栈”这种数据结构 使用数组实现:顺序栈 使用链表实现:链式栈 函数调用栈 操作系统给每个线程

    2024年02月08日
    浏览(56)
  • 数据结构与算法之美 | 排序(3)

    桶排序(Bucket sort) 基本思想 : 将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行排序。 桶内排完序之后,再把每个桶里的数据按照顺序依次取出,组成的序列就是有序的了。 桶排序常常用在外部排序[^1]中。 我们有 10 GB 的订单数据,我们希望按订单金额(

    2024年02月08日
    浏览(44)
  • 数据结构之美:如何优化搜索和排序算法

    🎉欢迎来到数据结构学习专栏~数据结构之美:如何优化搜索和排序算法 ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹 ✨博客主页:IT·陈寒的博客 🎈该系列文章专栏:数据结构学习 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习 🍹文章作者技术和水

    2024年02月08日
    浏览(55)
  • 数据结构与算法学习:二叉树的后序遍历的递归与非递归实现,以及非递归实现中的流程控制的说明。

    需求二叉树: 采用二叉树后序遍历非递归算法。设置一个指针p初始指向树根,p先入栈,而后使得p指向它的左孩子p-firstchild,重复操作,使得每个左孩子都依次入栈,同时初始化一个Treenode*类型的指针 pre,这个指针是后序前驱,这个后序前驱用以区分为已访问过的结点和未

    2023年04月22日
    浏览(49)
  • 青岛大学_王卓老师【数据结构与算法】Week05_11_栈与递归_学习笔记

    本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享, 另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权,请留言作删文处理。 课程视频链接: 数据结构与算法基础–第05周11–3.4栈和递归 递归的定义

    2024年02月16日
    浏览(49)
  • 从零开始学习数据结构—【链表】—【探索环形链的设计之美】

    双向环形链表带哨兵,这个时候的 哨兵 , 可以当头,也可做尾 带哨兵双向循环链表:结构稍微复杂,实现简单。一般用来单独存储数据,实际中使用的链表数据结构都是带头双向链表。另外,这个结构虽然结构复杂,但是使用代码实现后会发现结构会带来很多优势。 双向

    2024年02月22日
    浏览(44)
  • 数据结构与算法(小议递归)

    递归是一种常用的算法设计,递归就是一种循环推理。简单来说就是调用原算法本身的算法。 这里主要探讨递归的使用, 用一个简单的例子来看: 这是一个很流行的裴波那契数列计算函数,很多编程书籍喜欢拿这个数列做例子。当然一般不会这么写~ 这函数看上去很优雅,

    2024年02月01日
    浏览(56)
  • 算法与数据结构——递归算法+回溯算法——八皇后问题

    八皇后问题是一个经典的回溯算法问题,目的是在8×8的国际象棋棋盘上放置八个皇后,使得没有皇后可以互相攻击(即没有两个皇后在同一行、同一列或同一对角线上)。 回溯算法是一种解决问题的算法,它通过尝试所有可能的解决方案来解决问题。在八皇后问题中,计算

    2024年02月09日
    浏览(55)
  • 【算法】递归解决各种数据结构的遍历问题

    对于递归算法,我们最先想到的应该就是用递归的方式去中序遍历一棵树,递归的使用使得我们可以先深入到下层中,然后慢慢的输出下层的元素之后输出上层元素。 因此,基于此,我们甚至可以使用递归来逆序输出一个栈,链表等数据结构。 使用递归输出树 使用递归逆序

    2024年02月08日
    浏览(69)
  • 【数据结构】二叉树的遍历递归算法详解

    我们来写一个函数 BuyNode(x)函数 用于创建二叉树结点。 用动态开辟函数 malloc 函数进行动态开辟,并强制转换为 BTNode 型,用变量 node 来去管理开辟的空间。 我们初始化结点,其 val 即为传入的参数x,左右指针 left 和 right 都设为NULL。 我们在主函数中创建上面这样一颗二叉树

    2024年01月20日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包