当前位置: 首页 > 面试题库 >

了解基本递归

颜鸿云
2023-03-14
问题内容
public static void main (String[] args)
{
    System.out.println(factorial(5));
}

public int factorial(int n)
{
    if(n <= 1){
        return 1;
    }
    else{
        return n * factorial(n - 1);
    }
}

我在上面直接写了上面的内容,因此可能无法编译,但认为可以。

任何人都可以从存储的角度来简短地解释它的工作原理吗?它通过计算5 (5-1)开始,然后依次下降到4 (4-1)然后是3
*(3-1).....直到达到1,它将只返回1,对吗?抱歉,我太粗略了,我只想知道这是如何工作的

谢谢

但随着工作的进行,它将获得各个阶段的值

5 (5-1)4 (4-1)… … …

这些如何存储然后取回,或者我丢失了什么?


问题答案:

假设您是计算机,有人向您递纸

factorial(3)

写在上面。然后执行该过程,查看参数。因为它大于1,所以您写

factorial(2)

在另一张纸上,“交给自己”,等到得到答案后再继续。

再次执行该过程。由于2仍然> 1,所以您写

factorial(1)

放在另一张纸上,交给自己,等到得到答案后再继续。

再次,您执行该过程。这次输入为1,因此您进入第一个分支并返回1。正在处理阶乘(2)的调用现在有了一个答案,因此它将2与该答案(1)相乘并返回。现在,正在处理阶乘(3)的调用将获得答案(2)并将其乘以3,得出6。然后将答案返回给开始整个操作的人员。

如果您想在工作时将纸叠放在您面前的纸堆中,那就是计算机内存中“纸堆”的可视化。每次递归调用都将参数(和任何临时变量)存储在自己的纸上(堆栈框架),就像在纸上一样,按字面意义排列为下推式堆栈。



 类似资料:
  • 问题内容: 我正在努力了解基本的MySQL连接。 基本上,我有2个表,其中一个包含客户的名字和地址ID,另一个具有实际地址。 我不仅要显示客户名称和地址ID,还希望它显示客户名称和实际地址。 我的基本选择语句是这样的: 它将显示如下内容: 而不是我想将addressId与另一个表中的实际地址连接起来 像这样: 有谁可以向我展示实现这一目标的最佳方法? 也有人可以推荐一个很好的联接教程吗? 问题答案

  • 我对Web浏览器的基本身份验证有点困惑。我原以为Web浏览器只会在之前的响应中收到HTTP 401状态后发送授权标头。然而,似乎Chrome在之后的每个请求中都发送授权标头。它包含我曾经输入的数据,以响应我网站上的401,并与每条消息一起发送(根据Chrome和我的Web服务器附带的开发人员工具)。这是预期的行为吗?我应该在我的401中使用一些标头来推断不应该缓存授权内容吗?我目前正在使用WWW-

  • 1. 什么是基础库? 以上是凡泰小程序架构的示意图,最上面是主要的4个场景入口,开发者可以根据自己的业务场景运营这些场景入口,把这些入口的流量充分利用起来。中间框内的是小程序的核心引擎,上面是对开发者提供的基础组件和基础 API 能力,开发者根据这些组件和 API 来开发自己的小程序,满足用户的需求。 小程序前端框架借鉴了主流前端框架Vue的设计思路,从小程序的应用形态,提供了简洁的编程模型,定义

  • 问题内容: 我在这里找到了一个很棒的树指令。原文:http://jsfiddle.net/n8dPm/ 我一直在试图通过其他几个做题,要了解它的功能。我不太明白呈现树指令的递归调用是如何工作的。主要是编译功能 什么时候所有的编译函数都调用? $ compile函数何时被缓存在变量中(这是链接函数吗?),何时追加?为什么不总是附加? - 问题答案: Ng网站上有一些很棒的文档(我认为是最好的文档)。

  • 问题内容: 我在使用Java中的基本递归问题时遇到了很多麻烦;任何指针都很棒。 “写一种静态递归方法来打印出几何序列的第n个项:2、6、18、54。” 据我所知,我应该在代码中的某处递归地将某物乘以3,但我一直在努力寻找方法。我知道我需要终止声明,但是何时发生?我需要帮手方法吗? 问题答案: 一个递归函数是一个函数,它的实现引用自身。以下是一些有趣的示例: 解决问题的方法: 编辑 : 上面的类使用

  • 工作区 项目 项目文件夹 ...还有一些我可能会错过的?