Java递归

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

1.递归的概念:

一个方法在执行过程中调用自身, 就称为 "递归".

示例:

//递归求n的阶乘
public static void main(String[] args) {int n = 5;int ret = factor(n);System.out.println("ret = " + ret);
}public static int factor(int n) {if (n == 1) {return 1;}return n * factor(n - 1);
}

2.递归执行过程分析

示例:

//递归求n的阶乘 加上日志
public static void main(String[] args) {int n = 5;int ret = factor(n);System.out.println("ret = " + ret);
}public static int factor(int n) {System.out.println("函数开始, n = " + n);if (n == 1) {System.out.println("函数结束, n = 1 ret = 1");return 1;}int ret = n * factor(n - 1);System.out.println("函数结束, n = " + n + " ret = " + ret);return ret;
}

//结果

函数开始, n = 5
函数开始, n = 4
函数开始, n = 3
函数开始, n = 2
函数开始, n = 1
函数结束, n = 1 ret = 1
函数结束, n = 2 ret = 2
函数结束, n = 3 ret = 6
函数结束, n = 4 ret = 24
函数结束, n = 5 ret = 120
ret = 120

执行过程图:

 

程序按照序号中标识的 (1) -> (8) 的顺序执行

3.递归练习

示例1:

//按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4)

public static void print(int num) {if (num > 9) {print(num / 10);}System.out.println(num % 10);
}

示例2:

//递归求 1+2+3+...+10
public static int sum(int num) {if (num == 1) {return 1;}return num + sum(num - 1);
}

示例3:

//写一个递归方法,输入一个非负整数,返回组成它的数字之和,例如,输入1729,则返回

//1+7+2+9

public static int sum(int num) {if (num < 10) {return num;}return num % 10 + sum(num / 10);
}

示例4:求斐波那契数列的第N项

public static int fib(int n) {if (n == 1 || n == 2) {return 1;}return fib(n - 1) + fib(n - 2);
}

当我们求fib(40)的时候发现,程序执行速度极慢,原因是进行了大量的重复运算。

public class Test {public static int count = 0;public static void main(String[] args) {System.out.println(fib(40));System.out.println(count);}public static int fib(int n) {if (n == 1 || n == 2) {return 1;}if (n == 3) {count++;}return fib(n - 1) + fib(n - 2);}
}

可以使用循环的方式来求斐波那契数列问题, 避免出现冗余运算

public static int fib(int n) {int last2 = 1;int last1 = 1;int cur = 0;for (int i = 3; i <= n; i++) {cur = last1 + last2;last2 = last1;last1 = cur;}return cur;
}

此时程序的执行效率大大提高了.

小结:

递归是一种重要的编程解决问题的方式.


有些问题天然就是使用递归方式定义的(例如斐波那契数列, 二叉树等), 此时使用递归来解就很容易.


有些问题使用递归和使用非递归(循环)都可以解决. 那么此时更推荐使用循环, 相比于递归, 非递归程序更加高效.
 


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

相关文章

java递归算法(一)——详解以及几个经典示例

什么是递归 递归就是一个程序或函数在其中定义或说明有之间或者间接调用自身的一种方法&#xff0c;它通常把一个大型复杂的问题层层转化为一个原问题相似的规模较小的问题来求解&#xff0c;递归策略只需要少量的程序就可以描述出解题过程所需要的多次重复计算&#xff0c;大…

Java 递归算法

一、概述&#xff1a; Java递归&#xff1a;简单说就是函数自身直接或间接调用函数的本身。 二、应用场景&#xff1a; 若&#xff1a;一个功能在被重复使用&#xff0c;并每次使用时&#xff0c;参与运算的结果和上一次调用有关&#xff0c;这时就可以使用递归来解决这个问题…

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

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

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(…