【Java】递归算法

article/2025/10/29 12:29:20

文章目录

  • 什么是递归?
  • 递归求阶乘
  • 递归求解斐波那契数列
  • 猴子吃桃问题


什么是递归?

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

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

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

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

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

在这里插入图片描述
      递归算法是一种自下而上的思维,难点在于逻辑性;

需要明确以下几点:

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

下面用几个例子来说明:

递归求阶乘

在这里插入图片描述

  • 这里的递归出口为 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;}
}

在这里插入图片描述

递归求解斐波那契数列

斐波那契数列:又称黄金分割数列,指的是这样一个数列: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);
}

猴子吃桃问题

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

/*  猴子吃桃问题:小猴子摘了一堆桃子。第一天吃掉一半又多吃了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); }
}

http://chatgpt.dhexx.cn/article/lddcYQ1y.shtml

相关文章

Java递归算法

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

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

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

Probability And Statistics——CorrelationsCovariance

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

structural covariance network

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

_variant_t、CComVariant与COleVariant、CDBVariant

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

Partial correlation coefficient

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

Multilevel Cooperative Coevolution for Large Scale Optimization

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

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

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

numpy中的convolve的理解

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

Clustering Coefficient

Define Clustering Coefficient:聚类系数 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命令,好像可以对连续变量进行回归分析。 附件中是一篇pdf文档,主要介绍stata中关于meta分析的命令。跟大家分享一下。 里面在提到metareg命令时,列举了以下三个列子&#xff1a…

协方差矩阵简介(Covariance Matrix)

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

covariance matrix

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

经典排序算法——堆排序

对于一个int数组,请编写一个堆排序算法,对数组元素排序。 给定一个int数组A及数组的大小n,请返回排序后的数组。 测试样例: [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过程建堆堆排序算法总结 准备知识 堆的结构可以分为最大堆和最小堆,是一个完全二叉树,而堆排序是根据堆的这种数据结构设计的一种排序。 所谓完全二叉树即叶节点只能出现在最下层和次下层,并且最下面一层的结点…

堆排序算法设计与分析

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

堆排序算法实现

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

数据结构之堆排序算法详解+C语言实现

堆   堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。 堆排序   堆排序是利用堆这种数据结构而设计的一种排序算法&…

堆排序算法原理及实现

堆排序是排序中一种比较重要的算法,和快速排序一样,其复杂度也是O(nlogn);同时也是一种原地排序算法:在任何时候,数组中只有常数个元素存储在输入数组以外。堆这种数据结构是处理海量数据比较常见的结构,海…

堆排序算法Java

基本原理 1):将带排序的序列构造成一个大顶堆,根据大顶堆的性质,当前堆的根节点(堆顶)就是序列中最大的元素 2):将堆顶元素和最后一个元素交换,然后将剩下的节点重新构造成一个大顶堆; 3):重复步骤2 小知识…