递归与递归算法实例(java实现)

2023-11-01

 

 一、递归介绍

        递归算法(英语:recursion algorithm)在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。绝大 多数编程语言支持函数的自调用,在这些语言中函数可以通过调用自身来进行递归。

        定义: 一个方法在执行过程中调用自身, 就称为 “递归”。

如下图是递归算法的经典实例——hanoi塔问题

 

二、递归算法实例 

1、猴子吃桃:猴子第一天摘了若干个桃子,当即吃了一半,还不解馋,有多吃了一个;第二天,吃剩下的桃子的一半,还不过瘾,有多吃了一个;以后每天都吃前一天剩下的一半多一个,到第10天想再吃时,只剩下一个桃子了。问第一天共摘了多少个桃子?

public static void main(String[] args) {
        int peach = peach(1);
        System.out.println(peach);
    }

    /**
     * @param n 第几天
     * @return
     */
    public static int peach(int n){
        if(n == 10){
            return 1;
        }
        return (peach(n + 1) + 1) * 2;
 }

运行结果:

 2、不死神兔:一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?

案例分析:

  • 第一个月小兔子没有繁殖能力,所以还是一对;

  • 两个月后,生下一对小兔子,总数共有两对;

  • 三个月以后,老兔子又生下一对,因为小兔子还没有繁殖能力,总数共是三对;

  • 依次类推。

思路:

  • 这个数列的第1和2项属于固定值,F(1)=1,F(2)=1,;

  • 从第三项开始,F(n)=F(n - 1)+F(n - 2),可以使用递归实现,并要有一个出口;

public class FibonacciSequenceTest {
	public static void main(String[] args) {
		// 调用方法,获取12个月后的对数
		int total =fun(12);
		
        System.out.println("一年后兔子总对数是:"+total);
	}
	// 定义递归放获取对应月数的兔子总对数
	public static int fun(int m){
		if(m==1 || m==2) {
			return 1;
		}else {
			// 递归调用,求取前2个月对数之和
			return fun(m-1)+fun(m-2);
		}
	}
}

运行结果:

 3、小球落地:小球从100米高空落下,每次弹起高度为原来的一半,问第10次小球落地,小球共经过多少米?

public static void main(String[] args) {
        double height = height(10, 100);

        System.out.println(height);
    }

    /**
     *
     * @param n : 第几次落地
     * @param length : 初始高度
     * @return
     */
    public static double height(int n,double length){
        if (n == 1){
            return 100;
        }
        return length + height(n - 1,length / 2);
 }

运行结果:

4、递归实现二分查找

public class BinarySearchTest {
	 public static void main(String[] args) {
		 // 定义一个有序数组 
		 int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
		 // 调用递归算法查找元素位置
		 int key=4;
		 int index= binSearch(arr, 0, arr.length-1, key);
		 // 输出结果
		 System.out.println(key+"数字在数组的角标位置是:"+index);
	 }
	 // 定义递归二分算法
 	 public static int binSearch(int arr[], int start, int end, int key) {
 		 int mid = start + (end - start) / 2;
 		 // 找到对应元素
 		 if (arr[mid] == key) {
 			 return mid;
		 }
 		 if (key > arr[mid]) {
 			 // 递归调用二分查找
 			 return binSearch(arr, mid + 1, end, key);
		 } else if (key < arr[mid]) {
			 // 递归调用二分查找
			 return binSearch(arr, start, mid - 1, key);			
		 }
 		 // 没有找到,返回-1标志
 		 if (start >= end) {
 			 return -1;
 		 }
 		 return -1;
     }
}

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

递归与递归算法实例(java实现) 的相关文章

随机推荐

  • JAVA算法(分糖果)

    题目描述 有n个小朋友围坐成一圈 老师给每个小朋友随机发偶数个糖果 然后进行下面的游戏 每个小朋友都把自己的糖果分一半给左手边的孩子 一轮分糖后 拥有奇数颗糖的孩子由老师补给1个糖果 从而变成偶数 反复进行这个游戏 直到所有小朋友的糖果数都
  • 版本记录总结

    对构建中使用的版本进行记录
  • 【vue】this.$router.replace跳转不起作用 Router push or replace not working

    项目场景 商城APP底部导航切换对应页面 问题描述 提示 这里描述项目中遇到的问题 Just sit there clicking the home btn watching log show me home but never getti
  • Git远程库代码回退

    一 首先认识两个回退过程中很重要的命令 1 git log 显示所有提交过的版本信息 不包括已经被删除的 commit 记录和 reset 的操作 空格向下翻页 b 向上翻页 q 退出 git log pretty oneline git
  • 华为od机试 C++ 【计算最少步数】

    题目 小明计划在周末去爬山 他有一份包含山峰高度的地图 其中 0 代表平地 而 1 到 9 表示不同的山峰高度 小明可以向上 下 左或右移动一步 但是 由于他不想爬得太累 他决定只在高度差不超过 k 的地方移动 现在他站在地图的左上角 你能
  • 做好五年不跳槽的准备

    入职半年了 我觉得这里可以长久发展 其一 工作能胜任 我感觉找回自信了 甚至有些傲娇了 说明osg确实比较对口 做擅长的工作 会越做越有信心 其二 老大靠谱 老大十几年经验 并且很有耐心 工作方式也对 比如 先给你代码 在这个基础上改 并且
  • 超长整数相加

    链接 https www nowcoder com questionTerminal 5821836e0ec140c1aa29510fd05f45fc orderByHotValue 1 mutiTagIds 640 643 page 6
  • Python数据挖掘 数据预处理案例(以航空公司数据为例)

    Python数据预处理 一 内容 1 数据清洗 2 数据集成 3 数据可视化 二 实验数据 根据航空公司系统内的客户基本信息 乘机信息以及积分信息等详细数据 依据末次飞行日期 LAST FLIGHT DATE 以2014年3月31日为结束时
  • go build遇见“module *** found, but does not contain package ***”

    在实际项目中编译版本时遇见以下问题 common middleware sentinel go 4 2 module github com alibaba sentinel golang latest found v1 0 2 but do
  • SSH项目所需jar包下载地址

    struts2下载地址 http pan baidu com s 1c0joXbi hibernate下载地址 http pan baidu com s 1c0ues1a spring下载地址 http pan baidu com s 1b
  • JS学习篇(一)—— 数据类型篇

    JS学习篇 一 数据类型篇 JS的有八种数据类型 七种基本类型 undefined null Boolean number string symbol bigint 一种引用类型 object 七种基本类型 1 undefined 定义 通
  • (新)关于修改window.navigator.webdriver代码失效问题

    文章目录 前文回顾 溯源追根 解决方案 新登陆代码 写在最后 前文回顾 前面写过两篇关于sycm自动化爬取的文章 关于抓取代码的文章链接 出师未捷身先死的sycm数据自动化 关于chrome版本迭代后 代码失效问题解决方案的文章链接 关于修
  • mysql8.0一 服务启动

    声明 本文 禁止转载 本文所有观点和概念都系个人总结 难免存在疏漏之处 为不至于诱导初学者误入歧途 望各位以自己实践为准 特此声明 如有错误请告知 启动 流程 windows 7系统 创建data空目录 创建my ini文本文件 内容如下
  • Mac如何通过Xcode安装GCC编译器 How to install gcc on mac with xcode

    什么是GCC GCC GNU Compiler Collection 是由自由软件基金会 FSF Free Software Foundation Inc 研发的开源编译器集合 用一句话说 GCC就是除Windows以外的平台上使用最广的编
  • Java反射copy对象源到目标

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 使用反射机制 二 使用步骤 1 引入库 2 Copy数据 3 Fields 自定义注解 总结 前言 例如 随着很多流行的框架出现 反射也成了其中必不可少的
  • 【项目实战】Python实现循环神经网络SimpleRNN、LSTM进行淘宝商品评论情感分析(含爬虫程序)

    说明 这是一个机器学习实战项目 附带数据 代码 如需数据 完整代码可以直接到文章最后获取 1 项目背景 随着信息化社会的发展 互联网成为方便 快捷的信息获取渠道之一 在电子商务和社会网站中 大量非结构化的评论文本作为最直观的用户体验数据被保
  • 机器学习之k 均值聚类教程(代码实战,详解核心算法)

    k 均值聚类 1 引入依赖 import numpy as np import matplotlib pyplot as plt 调用sklearn中的方法直接生成数据 from sklearn datasets samples gener
  • vue2 ElementUI 表单标签、表格表头添加问号图标提示

    文章目录 1 问题背景 2 element ui悬浮提示定义 3 基础 4 延申 5 参考 1 问题背景 使用element ui有时候需要对表格的表头 表单的标签进行自定义 添加问号的悬浮提示 要达到的效果 如图所示 2 element
  • stmmac ethernet

    学习笔记 网卡驱动 从这里看起stmmac register platform 注册一个平台驱动 const struct stmmac of data meson dwmac data setup meson dwmac setup fi
  • 递归与递归算法实例(java实现)

    一 递归介绍 递归算法 英语 recursion algorithm 在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法 绝大 多数编程语言支持函数的自调用 在这些语言中函数可以通过调用自身来进行递归 定义 一个方法在执