首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >递归-我不明白它是如何工作的。

递归-我不明白它是如何工作的。
EN

Stack Overflow用户
提问于 2021-04-01 23:18:39
回答 4查看 79关注 0票数 0

我无法理解递归函数的一些内容。假设我在计算x数的阶乘。代码将如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
using namespace std;

int factorial(int y){
    if(y == 0)
        return 1;
    return y * factorial(y-1);


}

int main() {
    int n;
    cin >> n;
    cout << factorial(n);



    return 0;
}

在这里,据我理解,我有一个基本的例子,它会在某一时刻停止这个函数。很好,直到现在,在大小写之后,下一个语句将返回x*阶乘(x-1)。假设我们想要找到数字"4“的阶乘。看起来会是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
x = 5 --> x != 0, return 5 * factorial(4) | 
x = 4 --> x != 0, return 4 * factorial(3) | 
x = 3 --> x != 0, return 3 * factorial(2) |
x = 2 --> x != 0, return 2 * factorial(1) |
x = 1 --> x != 0, return 1 * factorial(0) |

现在,由于x等于0,下一个语句将运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if(x == 0)
  return 1;

我不明白的是:如果函数返回1,程序应该准确地返回数字"1",为什么以及如何返回递归语句计算出来的内容。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-04-01 23:35:37

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1) x = 5 --> x != 0, return 5 * factorial(4) | 
2) x = 4 --> x != 0, return 4 * factorial(3) | 
3) x = 3 --> x != 0, return 3 * factorial(2) |
4) x = 2 --> x != 0, return 2 * factorial(1) |
5) x = 1 --> x != 0, return 1 * factorial(0) |

阶乘(0)将返回1;因此,第5行将如下:

  1. x = 1 --> x != 0, return 1 * 1 x,它是factorial(1)

factorial(1)将返回1;因此,第4行将如下所示:

  1. x = 2 --> x != 0, return 2 * 1 x,它是factorial(2)

factorial(2)将返回2;因此第3行将如下所示:

  1. x = 3 --> x != 0, return 3 * 2 x,它是factorial(3)

factorial(3)将返回6;因此,第2行将如下所示:

  1. x = 4 --> x != 0, return 4 * 6 x,它是factorial(4)

factorial(4)将返回24;因此,第1行将如下所示:

  1. x = 5 --> x != 0, return 5 * 24 = 120

票数 1
EN

Stack Overflow用户

发布于 2021-04-01 23:53:06

如果需要,可以向代码中添加更多的可视化信息,以使流程在输出中更加可见。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
using namespace std;

void indent(int y) {
    for (int i = 0; i < y; ++i) {
        std::cout << "  ";
    }
}

int factorial(int y, int max){
    indent(max - y);
    std::cout << "calling factorial(" << y << ")" << std::endl;

    if(y == 0) {
        indent(max - y);
        std::cout << "returns 1" << std::endl;
        return 1;
    }
    auto ret = y * factorial(y-1, max);
    indent(max - y);
    std::cout << "returns " << ret << std::endl;
    return ret;


}

int factorial(int y) {
    return factorial(y, y);
}

int main() {
    // int n;
    // cin >> n;

    for (int n = 0; n < 5; ++n) {
        std::cout << "\nstart\n";
        cout << factorial(n) << std::endl;
    }

    return 0;
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
start
calling factorial(0)
returns 1
1

start
calling factorial(1)
  calling factorial(0)
  returns 1
returns 1
1

start
calling factorial(2)
  calling factorial(1)
    calling factorial(0)
    returns 1
  returns 1
returns 2
2

start
calling factorial(3)
  calling factorial(2)
    calling factorial(1)
      calling factorial(0)
      returns 1
    returns 1
  returns 2
returns 6
6

start
calling factorial(4)
  calling factorial(3)
    calling factorial(2)
      calling factorial(1)
        calling factorial(0)
        returns 1
      returns 1
    returns 2
  returns 6
returns 24
24

编译器资源管理器

票数 1
EN

Stack Overflow用户

发布于 2021-04-01 23:58:20

谢谢大家的帮助。有了你的评论,还有一段视频,我明白了。https://www.youtube.com/watch?v=aCPkszeKRa4 -视频.祝你们今天过得愉快!=)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66915735

复制
相关文章
重复组合
我们一共有n个区间,区间xi的元素个数表示第i个元素被抽出的次数。由于区间的元素个数可以为0,因此我们需要n+1个隔板来区分这些区间。
灯珑LoGin
2022/10/31
4900
Python - 删除列表中的重复字典
Python 是一个非常广泛使用的平台,用于 Web 开发、数据科学、机器学习以及自动化执行不同的过程。我们可以将数据存储在python中,以不同的数据类型,例如列表,字典,数据集。python字典中的数据和信息可以根据我们的选择进行编辑和更改
很酷的站长
2023/08/11
3601
Python - 删除列表中的重复字典
如何去掉列表中重复的元素
列表,在Python中是最常见的一种数据类型,对它了解的越多,编程的效率就越高。
TalkPython
2019/10/29
7.8K0
如何去掉列表中重复的元素
卷积神经网络中的参数共享/权重复制
参数共享或权重复制是深度学习中经常被忽略的领域。但是了解这个简单的概念有助于更广泛地理解卷积神经网络的内部。卷积神经网络(cnn)能够使那些通过网络馈送的图像在进行仿射变换时具有不变性。这个特点提供了识别偏移图案、识别倾斜或轻微扭曲的图像的能力。
deephub
2020/07/24
2.1K0
卷积神经网络中的参数共享/权重复制
Python——去除列表中的重复元素
set(['I', 'I', 'M', 'E']) set(['I', 'E', 'M']) 集合中,没有重复的元素。利用集合这种数据结构的特性,可以去除列表中的重复元素。 一个列表中可能含有重复元素,使用set()可以实现列表的去重处理,但是无法知道哪些元素是重复的,下面的函数用于找出哪些元素重复了,以及重复的次数。 from collections import Counter a = [1,4,2,3,2,3,4,2] b = Counter(a) #求数组中每个数字出现了几次 print(b)
瑞新
2020/07/07
5K0
python中删除列表中重复元素
在面试中,很可能遇到给定一个含有重复元素的列表,删除其中重复的元素,下边给出三种方法来实现这个功能。
全栈程序员站长
2022/09/07
4.1K0
【说站】Python删除列表中的非字母字符
如果不是字符 a 到 z(大写和小写),则会导致匹配。匹配项被替换为空白字符。您可以将您想要的任何内容放入替换参数中。
很酷的站长
2022/11/24
2.5K0
【说站】Python删除列表中的非字母字符
电话号码的字母组合
难度:中等 来源:17. 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例: 输入:
用户4456933
2021/06/01
4550
电话号码的字母组合
快速在组合中查找重复和遗失的元素
? ? ? ? ? ? ? ?
望月从良
2018/09/29
4.4K0
快速在组合中查找重复和遗失的元素
电话号码的字母组合
给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合。 给出数字到字母的映射如下,即与电话按键相同。注意1不对应任何字母。
WindRunnerMax
2020/08/27
4350
使用Python,怎么去除列表中重复的内容?
问:使用Python,怎么去除列表中重复的内容? 今日分享的内容,很简单,很常用。话不多说,直接开始。 mylist = ["a", "b", "a", "c", "c"] mylist = list(dict.fromkeys(mylist)) print(mylist)
TalkPython
2020/12/29
3.6K0
Python中如何获取列表中重复元素的索引?
昨天分享了一个文章,Python中如何获取列表中重复元素的索引?,后来【瑜亮老师】看到文章之后,又提供了一个健壮性更强的代码出来,这里拿出来给大家分享下,一起学习交流。
前端皮皮
2022/08/17
13.5K0
Python中如何获取列表中重复元素的索引?
LeetCode - 电话号码的字母组合
原题地址:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/
晓痴
2019/07/24
5770
LeetCode - 电话号码的字母组合
组合模式在商品分类列表中的应用 顶
{"id":100,"name":"根目录","takeCareProducts":[{"id":200,"name":"可乐","takeCareProducts":[{"id":1,"model":"500ml","name":"可口可乐","price":3}]},{"id":300,"name":"咖啡","takeCareProducts":[{"id":2,"model":"600ml","name":"雀巢咖啡","price":6}]}]}
算法之名
2019/08/20
2K0
组合问题——LeetCode题目17:电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
二环宇少
2020/08/13
6060
组合问题——LeetCode题目17:电话号码的字母组合
11 - 去掉列表或元组中的重复元素
在python 中如何定义集合,集合与列表有什么区别 # 列表 a = [1, 2, 3, 4, 5] print(type(a)) # 元组 b = (1, 2, 3, 4, 5) print(type(b)) # 集合 c = {1, 2, 3, 4, 5} print(type(c)) <class 'list'> <class 'tuple'> <class 'set'> # 区别: # 1. 集合没有重复的元素,而列表可以有重复的元素 a = [1, 2, 2, 3, 4] print(a)
ruochen
2021/05/22
3.6K0
11 - 去掉列表或元组中的重复元素
python 列表的排列组合
permutations/combinations/combinations_with_replacement
用户5760343
2019/09/30
1.3K0
如何更稳健的计算组合最优权重(附代码)
今天分享的论文是Marcos López de Prado 2019年的论文《A ROBUST ESTIMATOR OF THE EFFICIENT FRONTIER》本文主要有两个创新点。
量化投资与机器学习微信公众号
2021/07/29
2.6K0
17. 电话号码的字母组合
示例 1: 输入:digits = "23" 输出:["ad","ae","af","bd","be","bf","cd","ce","cf"] 示例 2: 输入:digits = "" 输出:[] 示例 3: 输入:digits = "2" 输出:["a","b","c"]
CaesarChang张旭
2021/06/22
2830
17. 电话号码的字母组合
点击加载更多

相似问题

具有重复列表的所有组合

11

获取具有重复值的列表的所有组合

15

如何创建具有特定重复模式的字母/数字列表?

17

获取具有k号字母列表的所有n号组合。

12

如何获得具有重复值的列表的所有组合

322
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文