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

article/2025/10/29 12:34:37

 

 一、递归介绍

        递归算法(英语: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;}
}

 

 


http://chatgpt.dhexx.cn/article/5FbZ7YBu.shtml

相关文章

Java的递归算法

递归算法设计的基本思想是&#xff1a;对于一个复杂的问题&#xff0c;把原问题分解为若干个相对简单类同的子问题&#xff0c;继续下去直到子问题简单到能够直接求解&#xff0c;也就是说到了递推的出口&#xff0c;这样原问题就有递推得解。 关键要抓住的是&#xff1a; &…

java递归算法实现

Coding多了&#xff0c;递归算法是非常常见的&#xff0c;最近我一直在做树形结构的封装&#xff0c;所以更加的离不开递归算法。所以今天就简单说一下这个递归算法&#xff0c;用java实现一个非常经典的递归实例。 递归算法&#xff0c;其实说白了&#xff0c;就是程序的自身调…

【Java】递归算法

文章目录 什么是递归&#xff1f;递归求阶乘递归求解斐波那契数列猴子吃桃问题 什么是递归&#xff1f; 程序 调用自身 的编程技巧成为 递归&#xff08;recursion&#xff09;。 递归算法是一种直接或间接调用、定义自身的函数或方法的算法&#xff0c;也就是调用自身。 递归…

Java递归算法

递归在程序语言中就是方法本身自己调用自己&#xff0c;而递归思想是算法的重要思想之一&#xff0c;就是利用递归来实现解决问题的算法。 递归也分为直接递归和间接递归。 那么什么叫直接递归什么又叫间接递归呢&#xff1f; //直接递归调用 function(){...function();... …

散布矩阵(scatter_matrix)及相关系数(correlation coefficients)实例分析

在进行机器学习建模之前&#xff0c;需要对数据进行分析&#xff0c;判断各特征(属性&#xff0c;维度)的数据分布及其之间的关系成为十分必要的环节&#xff0c;本文利用Pandas和Numpy的散布矩阵函数及相关系数函数对数据集特征及其关系进行实例分析。 散布矩阵(scatter_matri…

Probability And Statistics——CorrelationsCovariance

Skew&#xff08;偏度&#xff09; 在概率论和统计学中&#xff0c;偏度衡量实数随机变量概率分布的不对称性。偏度的值可以为正&#xff0c;可以为负或者甚至是无法定义。在数量上&#xff0c;偏度为负&#xff08;负偏态&#xff09;就意味着在概率密度函数左侧的尾部比右侧的…

structural covariance network

structural covariance network 结构协方差网络 结构协方差网络是一个较老的概念&#xff0c;只是近年受到了一定的重视。 大佬 Aaron Alexander-Bloch 在2013年通过一篇综述描述了这种结构协方差网络的应用意义及前景。 既往一般是在bold信号和fiber tracking建立连接&#xf…

_variant_t、CComVariant与COleVariant、CDBVariant

目前计算机语言多种多样&#xff0c;如C、Java、Basic、Pascal等&#xff0c;此外还有JavaScript、VBScript、ActionScript等脚本语言&#xff0c;它们各自维护自己的数据类型&#xff0c;当使用C这样强类型的语言来读取数据库或者与其他语言之间来交换数据时&#xff0c;它很有…

Partial correlation coefficient

利用PYTHON计算偏相关系数&#xff08;Partial correlation coefficient) 在统计学中&#xff0c;我们经常使用皮尔逊相关系数来衡量两个变量之间的线性关系。然而&#xff0c;有时我们感兴趣的是理解两个变量之间的关系&#xff0c;同时控制第三个变量。 例如&#xff0c;假设…

Multilevel Cooperative Coevolution for Large Scale Optimization

0、论文背景 本文在CCEA_G的基础上&#xff0c;提出了MLCC框架。在MLCC中&#xff0c;基于不同组大小的随机分组策略构造了一组问题分解器。演化过程分为若干个循环&#xff0c;在每个周期开始时&#xff0c;MLCC使用自适应机制根据其历史性能选择分解器。由于不同的组大小捕获…

mean value coordinates(均值重心坐标)定义及证明

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 在图形学中对于物体的描述往往是离散&#xff0c;但是在具体展示过程中我们又希望是连续。线性插值是解决离散与连续的常用手段。 三角形中的插值点击前往凸四边形中的…

numpy中的convolve的理解

写在前面 浏览更多内容&#xff0c;可访问&#xff1a;http://www.growai.cn 欢迎您关注作者知乎&#xff1a;ML与DL成长之路 推荐关注公众号&#xff1a;AI成长社&#xff0c;ML与DL的成长圣地。 函数 numpy.convolve(a, v, mode‘full’)&#xff0c;这是numpy函数中的卷…

Clustering Coefficient

Define Clustering Coefficient&#xff1a;聚类系数 Clustering Coefficient measures the degree to which nodes in a network tend to cluster or form triangles. ——聚类系数衡量网络中节点倾向于聚类或形成三角形的程度 Triadic Closure 三元闭包 The tendency of…

covariate(covariate是控制变量吗)

如何用STATA对连续性变量进行meta回归分析 在stata中有个metareg命令&#xff0c;好像可以对连续变量进行回归分析。 附件中是一篇pdf文档&#xff0c;主要介绍stata中关于meta分析的命令。跟大家分享一下。 里面在提到metareg命令时&#xff0c;列举了以下三个列子&#xff1a…

协方差矩阵简介(Covariance Matrix)

协方差矩阵定义 首先我们要明白&#xff0c;协方差实际是在概率论和统计学中用于衡量两个变量的总体误差,当然方差是协方差的一种特殊情况&#xff0c;即当两个变量是相同情况。它表示的是两个变量的总体的误差&#xff0c;这与只表示一个变量误差的方差不同。如果两个变量的变…

covariance matrix

协方差的定义 对于一般的分布&#xff0c;直接代入E(X)之类的就可以计算出来了&#xff0c;但真给你一个具体数值的分布&#xff0c;要计算协方差矩阵&#xff0c;根据这个公式来计算&#xff0c;还真不容易反应过来。这里用一个例子说明协方差矩阵是怎么计算出来的吧。 记住&…

经典排序算法——堆排序

对于一个int数组&#xff0c;请编写一个堆排序算法&#xff0c;对数组元素排序。 给定一个int数组A及数组的大小n&#xff0c;请返回排序后的数组。 测试样例&#xff1a; [1,2,3,5,2,3],6 [1,2,2,3,3,5] class HeapSort { public:int* heapSort(int* A, int n) {BuildMaxHeap(…

堆排序算法原理及c++实现

文章目录 准备知识MAX-HEAPIFY过程建堆堆排序算法总结 准备知识 堆的结构可以分为最大堆和最小堆&#xff0c;是一个完全二叉树&#xff0c;而堆排序是根据堆的这种数据结构设计的一种排序。 所谓完全二叉树即叶节点只能出现在最下层和次下层&#xff0c;并且最下面一层的结点…

堆排序算法设计与分析

堆排序(HeapSort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法&#xff0c;它是选择排序的一种。堆分为大根堆和小根堆&#xff0c;是完全二叉树。大根堆要求父结点的值大于或等于子结点的值&#xff0c;小根堆相反。根据大根堆的性质&#xff0c;我们可以知道最大值一…

堆排序算法实现

堆排序:结构逻辑上是完全二叉树,但是可以使用顺序存储来实现 一些二叉树的区别: 二叉树:度数最大为2并且每个子树也是二叉树 满二叉树:每层节点都是满的,没有空缺,也就是,叶子节点只能出现在最后一层 完全二叉树:限制条件比满二叉树弱化,只需要前k-1层是满二叉树结构,最后…