当前位置: 首页 > 知识库问答 >
问题:

Java简单递归解释

暴绪
2023-03-14

我实现了一个非常简单的递归方法,将两个数相乘在一起。我很难理解递归的基本知识。

有没有人能向我解释(如果可能的话,逐行解释)这段代码是如何工作的?我尤其感到困惑的是,基大小写被写为返回0,而实际上返回的是实际的乘法。

    public static int multiply(int n, int m) {
    if (m == 0) {
        return 0; //Base case
    }
    return multiply(n, m - 1) + n; //Recursive Case - Decrements m, while adding n
}

谢谢你的帮助

共有1个答案

薛淳
2023-03-14

我会尽量让这个答案初学者友好。首先我回答你的这部分问题:

我尤其感到困惑的是,基大小写被写为返回0,而实际上返回的是实际的乘法。

在基本大小写中返回的值取决于如何实现算法。这里为了计算n*m,我们将这个乘法扩展为加法。几个例子将使这一点更加清楚。

2*3 = 2 + 2 + 2 + 0
4*1 = 4 + 0
5*5 = 5 + 5 + 5 + 5 + 5 + 0
n*m = n + n + n + ... + (m times) + 0

这就是为什么我们在基本情况下返回0,我们必须停止递归而不对结果做任何改变,这只有当我们添加0时才有可能。

以下是该程序的工作原理:

public static int multiply(int n, int m) {
if (m == 0) {
    return 0; //Base case
}
return multiply(n, m - 1) + n;

让我们取n=4m=3

我们对该方法的第一个调用是multiply(4,3)。然后我们继续,基础条件是假的,所以我们跳过它。

然后我们进入这一部分:返回multiply(n,m-1)+n。我们对同一个函数进行另一次调用。多个(4,2)。我们再次跳过基本情况。下面是一张表:

multiply(4, 3) -> return multiply (4, 2) + 4
multiple(4, 2) -> return multiply (4, 1) + 4
multiple(4, 1) -> return multiply (4, 0) + 4
multiple(4, 0) -> 0

在替换我们得到的返回值时,

multiple(4, 3) -> return 0 + 4 + 4 + 4 
multiple(4, 2) -> return 0 + 4 + 4
multiple(4, 1) -> return 0 + 4
multiple(4, 0) -> return 0

如果我们的第一个调用是multiply(n,m),那么最后返回的值是:

multiply (n, m) -> return 0 + n + n + n + ... + (m times)

我希望我帮了你。试着自己构建一个类似的关系,这样你就会更好地理解它。下面是关于递归的进一步解释的链接:

https://www.geeksforgeeks.org/recursion

 类似资料:
  • 本文向大家介绍什么是递归?用Java写一个简单的递归程序,包括了什么是递归?用Java写一个简单的递归程序的使用技巧和注意事项,需要的朋友参考一下 什么是递归?用Java写一个简单的递归程序 递归的定义 递归(recursion):以此类推是递归的基本思想,将规模大的问题转化为规模小的问题来解决。 递归的要素 自定义递归函数,并确定函数的基本功能 例如Java从键盘输入一个数,求输入这个数的阶乘。

  • 问题内容: 我目前在理解和编写递归查询时遇到一些麻烦。我知道递归查询用于搜索信息层次结构,但是我还没有找到一个可以遍历层次结构的简单在线解决方案。例如,假设我有一个对家谱建模的关系: 如果我想编写一个遍历此家谱的递归查询,收集所有父母直到出生,我该如何处理? 提前致谢。 问题答案: 您可以使用子句。 在您的情况下,SQL可能类似于:

  • 问题内容: (希望)对某些人来说,这是一个非常简单的问题。 我有一个来自mySQL数据库的递归菜单,现在我的主要问题是: 创建URL的最佳方法是什么?我希望输入每行的标题,例如/ eggs / milk / bacon /。鸡蛋处于0级,例如:鸡蛋0,牛奶1,培根2。关于如何动态输出此内容的任何想法? 对于“ cletus”所说的这个问题,我几乎要去做些评论:PHP / MySQL- 建立导航菜单

  • 本文向大家介绍简单了解java数组传递方法,包括了简单了解java数组传递方法的使用技巧和注意事项,需要的朋友参考一下 Java 使用值传递(pass by value)的方式将实参传递给方法。传递基本数据类型变量的值与传递数组值会有很大的不同 对于基本数据类型参数,传递的是实参的值 对于数组类型参数,参数值是数组的引用,给方法传递的是这个引用。从语义上来讲,最好的描述就是参数传递的共享信息,即方

  • 对于,我被赋予和。 现在给定N、A、B、C和X,如何有效地找到所有N个元素? 我需要把这N个元素分成2组,其中最大的元素在第一组,第二大的元素在第二组,第三大的元素在第一组,以此类推。。。最后需要找到两个集合元素之和的绝对差。 我可以在不计算所有元素的情况下找到这个差异吗?因为N可以大到最大值为100。

  • 我正在努力将非平凡函数映射为尾递归。 就拿简单的玫瑰树来说 带地图 (更不用说绑定了) 使这种尾部递归似乎很痛苦,我已经看过了FSharpx之类的例子,但它们不是尾部递归的。我找到了这个 https://www.gresearch.co.uk/article/advanced-recursion-techniques-in-f/ 但是,从基于连续性的最后一个示例开始的飞跃似乎相当符合他们的示例(m