首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么这个递归阶乘程序只返回我想要计算的数字?

递归阶乘程序只返回想要计算的数字,是因为在程序中没有正确处理递归的终止条件和递归调用的返回值。

递归是一种通过调用自身的方式解决问题的方法。在阶乘程序中,递归的思路是将一个数n的阶乘表示为n乘以(n-1)的阶乘,直到n等于1时终止。

然而,如果在递归函数中没有正确处理终止条件,程序将会无限递归下去,导致栈溢出或死循环。在这个问题中,可能是没有判断当n等于1时直接返回1,或者没有正确处理递归调用的返回值。

为了解决这个问题,可以在递归函数中添加一个终止条件,当n等于1时直接返回1。同时,在递归调用时,需要将递归函数的返回值正确地累乘到当前的结果中。

以下是一个修复后的递归阶乘程序的示例(使用Python语言):

代码语言:txt
复制
def factorial(n):
    if n == 1:
        return 1
    else:
        return n * factorial(n-1)

这个修复后的程序中,当n等于1时,直接返回1。否则,将n乘以调用factorial函数计算(n-1)的阶乘的结果,并返回。

这样修复后的程序就能正确计算任意数字的阶乘了。

腾讯云相关产品和产品介绍链接地址:

  • 云函数(Serverless):https://cloud.tencent.com/product/scf
  • 云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 云数据库 MySQL 版(CMYSQL):https://cloud.tencent.com/product/cdb_mysql
  • 云原生应用引擎(TKE):https://cloud.tencent.com/product/tke
  • 云存储(COS):https://cloud.tencent.com/product/cos
  • 人工智能(AI):https://cloud.tencent.com/product/ai
  • 物联网(IoT):https://cloud.tencent.com/product/iotexplorer
  • 移动开发(移动推送):https://cloud.tencent.com/product/umeng_push
  • 区块链(BCS):https://cloud.tencent.com/product/bcs
  • 元宇宙(Tencent XR):https://cloud.tencent.com/product/xr
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

初识C语言·递归

,没有停止条件,所以,递归想要结束是需要限制条件,至于为什么会栈溢出呢?...那么递归限制条件就是 1)递归时候应该有限制条件 2)每次递归时候都应该越来越接近这个限制条件 3 好了,递归基本内容就那么多,直接举例咯 1)递归实现n阶乘 先看看不用递归实现阶乘 int...我们知道,阶乘是给一个数,从1 开始乘,乘到这个数,那么问题可不可以简化成一个数乘比自己小1数,小1那个数再乘比自己小1数呢?看行,那么限制条件呢?...限制条件应该是这个数每次减1都应接近于1,为1时候就返回1,结束程序。 来吧,实现。...而且,每次调用递归时候,也就是调用函数了,内存里面会为这个函数单独开辟一块空间,也就是说你这个程序没有结束,那么空间会一直开辟下去,所以理论上来讲,即便是一个合理程序,只要递归次数足够多,是可以导致栈溢出

11410

【C语言】函数系统化精讲(三)

• 每次递归调用后,逼近该限制条件。 下面我们来进行递归举例,更加深刻了解一下吧! 二、递归举例 2.1求n阶乘 计算n阶乘(不考虑溢出),n阶乘就是1~n数字累积相乘。...所以如果不想使用递归就得想其他办法,通常就是迭代方式(通常就是循环方式)。 ⽐如:计算n阶乘,也是可以产⽣1~n数字累计乘在⼀起。...,是我们很难接受,这也说明递归写法是非常低效,那是为什么呢?...此时程序并没有停止,而是不断计算,我们可以Ctrl+Shift+Esc打开任务管理器,我们可以看到我们程序CPU占比13.7%(这个13.7%不是最高),(由于代码运行起来后,电脑便会风扇转起,...直接CPU干起来,博主电脑无法立刻截不了图,所以导致截图不到想要高CPU运行百分比,推荐你们也可以尝试一下) 其实递归程序会不断展开,在展开过程中,我们很容易就能发现,在递归过程中会有重复计算

8710
  • c语言函数递归与迭代详解(含青蛙跳台阶问题详解)

    两个例子 举例2:求n阶乘 一个正整数阶乘是所有小于及等于该数正整数积,并且0阶乘为1。自然数n阶乘写作n!。 题目:计算n阶乘(不考虑溢出),n阶乘就是1~n数字累积相乘。...当代码执行到这个printf函数时,它不会直接进行输出,而是先进如ADD函数计算结果,并得到返回值,然后这个返回值再被printf调用进行输出。...如果不想使用递归,就得想其他办法,通常就是迭代方式(通常就是循环方式) 比如:计算n阶乘,除了上面的思路,也是可以产生1~n数字累计并乘在一起。...其实递归程序会不断展开,在展开过程中,我们很容易就能发现,在递归过程中会有重复计 算,而且递归层次越深,冗余计算就会越多。...那么对于这个问题,我们可以逆向来分析。 我们可以先计算青蛙想要跳上最后一级台阶(登顶)有多少种可能: 显然,有两种办法,从n-1跳一级上去,从n-2跳两级上去。

    5810

    【C语言】初学C语言经典题目(范围广,内容多)

    让我们一起加油把 ---- 目录 前言 scanf函数使用 判断素数 闰年判断 九九乘法表 在一个有序数组中查找数字 N阶乘计算1!+2!+......+n!...两边向中间移动 模拟登录操作 猜数字 关机程序 模拟实现strlen()函数 递归实现计算一个数每位之和 递归和非递归实现求第n个斐波那契数 交换数字 结束语 ---- 前言 大家好啊,今天带来是关于学习...scanf函数使用 先别着急,一开始,先来简单介绍一下scanf函数,我们都知道scanf函数是用来输入,比如想输入一个字符,一个数字,一串字符,一串数字等等这些。...解法二:递归解法 递归解法分为两种情况,一种是当n=1时,不用去算,1阶乘就是1。当n大于1时候,我们直接采用递归来解决。 ---- 计算1!+2!+......+n!...解法一:递归实现 解法二:非递归实现 ---- 递归实现计算一个数每位之和 如果是1位数的话,直接返回就OK了,两位以上,先去/10然后递归下去解决便可。

    1.6K30

    《Python基础教程》第六章--读书

    还会详细介绍参数(parameter)和作用域(scope)概念,以及递归概念及其在程序用途。 懒惰即美德 斐波那契数列:任何一个数都是前两个数之和数字序列。...of the number 并非真正函数函数 数学意义上函数,总在计算其参数后返回点什么。...为什么会这样呢? 位置参数和关键字参数混合使用情况,位置参数是要放在关键字参数之前。这里,不是这个原因。...内建vars函数可以返回这个字典: >>>x=1 >>>y=1 >>>scope=vars() >>>scope['x'] 1 vars可以返回全局变量字典。 locals返回局部变量字典。...return result 关键在于阶乘定义: 1阶乘是1 大于1数n阶乘是n乘n-1阶乘 现在看看递归版本: def factorial(n): if n==1:

    72110

    函数递归与迭代附n阶乘+顺序打印一个整数每一位数+求第n个斐波那契数

    题目:计算n阶乘(不考虑溢出),n阶乘就是1~n数字累积相乘。 2.1.1 分析和代码实现 我们知道n阶乘公式: n! = n *( n - 1)! 举例: 5!...在这之后,程序开始回归,首先回归到Fact(1)= 1 * Fact(0),然后程序继续回归,直到Fact(5),所以最终计算出5阶乘。...所以如果不想使用递归就得想其他办法,通常就是迭代方式(通常也就是循环方式)。 比如:计算n阶乘,也是可以产生1~n数字累计乘在⼀起。...,需要很长时间才能算出结果,这个计算所花费时间,是我们很难接受,这也说明递归写法是非常低效,那是为什么呢?...其实递归程序会不断展开,在展开过程中,我们很容易就能发现,在递归过程中会有重复计算,而且递归层次越深,冗余计算就会越多。

    12010

    探索Java递归无穷魅力,解决复杂问题轻松搞定,有两下子!

    递归可能不是所有问题最佳解决方案,有时迭代方法可能更高效。递归适用场景  递归可以应用于各种场景。以下是一些常见递归应用场景:求阶乘阶乘是指从1到指定数字之间所有数字乘积。...返回结果 (return a + b;):将递归调用结果相加并返回这个和就是第n个斐波那契数。代码作用  这段代码实现了计算任意位置斐波那契数函数。...如果不是,方法将递归地调用自身来计算n-1和n-2位置斐波那契数。将这两个递归调用结果相加得到第n个斐波那契数,并返回这个结果。...返回结果:函数返回计算得到阶乘值。...文档等海量资料,你想要都有!

    19820

    《Python入门08》你知道Python递归函数怎么写吗~~

    你将发现运行一段时间后,这个程序崩溃了(引发异常)。从理论上说,这个程序将不断运行下去,但每次调用函数时,都将消耗一些内存。...因此函数调用次数达到一定程度(且之前函数调用未返回)后,将耗尽所有的内存空间,导致程序终止并显示错误消息“超过大递归深度” 你想要是能对你有所帮助递归函 数,这样递归函数通常包含下面两部分。... 基线条件(针对小问题):满足这种条件时函数将直接返回一个值。  递归条件:包含一个或多个调用,这些调用旨在解决问题一部分。...前面说过,每次调用函数时,都将为此创建一个新命名空间。这意味着函数调用自身时,是两个不同函数[更准确地说,是不同版本(即命名空间不同)同一个函数]在交流。 经典案例1,计算数字n阶乘。...然而,在很多情况下,使用递归可读性更高,且有时要高得多,在你理解了函数递归式定义时尤其如此。另外,虽然你完全能够避免编写递归函数,但作为程序员,你必须能够读懂其他人编写递归算法和函数。

    1.2K20

    【C语言】函数递归总结

    之前总结完函数相关知识,只差个函数递归,这篇着重讲解一下函数递归 1.什么是递归 递归其实是一种解决问题方法,在C语言中,递归就是函数自己调用自己。...• 每次递归调用之后越来越接近这个限制条件。 2. 递归举例 2.1 举例1:求n阶乘 ⼀个正整数阶乘(factorial)是所有小于及等于该数正整数积,并且0阶乘为1。...⾃然数n阶乘写作n! 题目:计算n阶乘(不考虑溢出),n阶乘就是1~n数字累积相乘。 2.2 分析和代码实现 我们知道n阶乘公式:n! = n ∗ (n − 1)! 5!...Fib(n-1)+Fib(n-2); } 当我们n输入为50时候,需要很长时间才能算出结果,这个计算所花费时间,是我们很难接受, 这也说明递归写法是非常低效,那是为什么呢?...其实递归程序会不断展开,在展开过程中,我们很容易就能发现,在递归过程中会有重复计算,而且递归层次越深,冗余计算就会越多 所以有时候,递归虽好,但是也会引入一些问题,所以我们一定不要迷恋递归,适可而止就好

    6210

    C语言函数:编程世界魔法钥匙(2)-学习笔记

    现在,让我们继续前行,走进函数递归与迭代奇妙领域。 1、函数递归 想象一下,你要计算一个非常大阶乘,有没有一种神奇方法,可以让一个函数自己调用自己来完成这个复杂计算呢?...(归)       图一       图二 图二呢就像是我们所编写代码,在程序未运行起来之前,展现给我们只是少量代码。  代码解释:比如说我们有一个递归函数,它任务是计算某个数阶乘。...当 n 大于 1 时,函数就会调用自己来计算 (n - 1) 阶乘,然后将 n 乘以这个结果,从而得到 n 阶乘。  这道题我们要计算阶乘。...39088169次,三千多万次, 效率低下,并且在使用 fib 这个函数时候如果我们要计算第50个斐波那契数字时候特别耗费时间。...这是为什么呢? 其实在使用递归求结果时候,递归程序会不断展开,在展开过程中,我们很容易就能发现,在递归过程中会有大量重复计算,⽽且递归层次越深,冗余计算就会越多。

    5310

    【c语言】一篇文章搞懂函数递归

    程序运行到满足这个限制条件时候,递归就会停止。而每一次递归,都会不断接近这个限制条件。我们在编写递归时候,一定要先确定好限制条件。...不过,我们好像遗漏了一个问题:0阶乘是不是也是1?所以我们应该计算到0阶乘为止,这样,用户输入0程序就不会出现问题了。...如果你还是难以理解,我们画一张图来显示它详细流程: 程序前半部分逐层深入,从求5阶乘深入到求0阶乘这个过程叫做递推,由于我们递归限制条件是n==0,当计算到0阶乘时,此层递归传入参数刚好是...这时候,1就是此层递归返回值,便于前一层递归计算1阶乘,直到最后得出最后结果。这个过程叫做回归。 现在,想必你对递归已经有一定认知了。...= EOF)//这里进行多组输入 { printf("%d ", fib(n)); } return 0; } 运行结果: 三、递归潜在问题 对于之前求斐波那契数程序,如果我们输入一个较大数字比如

    13010

    递归递归之书:引言到第四章

    递归并没有某种特殊能力使其能够执行迭代算法无法执行计算。任何迭代循环都可以重写为递归函数。 本章比较和对比了递归和迭代。我们将研究经典斐波那契和阶乘函数,并看看它们递归算法为什么有关键弱点。...这是递归,因为 5 阶乘(或任何数字n)定义包括 4 阶乘数字n - 1)定义。依此类推,4! = 4 × 3!,以此类推,直到必须计算 1!,即基本情况,它只是 1。...当原始函数调用factorial()返回时,它返回计算阶乘为什么递归阶乘算法很糟糕 用于计算阶乘递归实现有一个关键弱点。计算 5 阶乘需要五次递归函数调用。...更糟糕是,递归解决方案存在一个关键低效性,下一节将对此进行解释。 为什么递归斐波那契算法很糟糕 与递归阶乘算法一样,递归斐波那契算法也存在一个关键弱点:它一遍又一遍地重复相同计算。...sum()函数返回值也是一个单一数字值,而不是一个数字数组;这就是为什么我们可以在递归情况中将head和sum(tail)相加❹。

    63810

    【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)

    递归限制条件 递归在书写时候,有2个必要条件: 递归存在限制条件,当满⾜这个限制条件时候,递归便不再继续 每次递归调⽤之后越来越接近这个限制条件 在下⾯例⼦中,我们逐步体会这2个限制条件 递归举例...所以如果不想使⽤递归,就得想其他办法,通常就是迭代⽅式(通常就是循环⽅式)。 ⽐如:计算n阶乘,也是可以产⽣1~n数字累计乘在⼀起。...return Fib(n-1)+Fib(n-2); } 如果当我们输入50以上数字n时,需要很⻓时间才能算出结果,这个计算所花费时间,是我们很难接受, 这也说明递归写法是⾮常低效,那是为什么呢...其实递归程序会不断展开,在展开过程中,我们很容易就能发现,在递归过程中会有重复计 算,⽽且递归层次越深,冗余计算就会越多。...(当做一个归纳结论了解一下就行) 以上就是有关递归详细介绍啦,各位大佬有什么问题欢迎在评论区指正,您支持是创作最大动力!❤️

    6610

    尾调用和尾递归

    // 3628800 factorial(500000); // Uncaught RangeError: Maximum call stack size exceeded 上面是使用递归计算阶乘例子...,操作系统为JS引擎调用栈分配内存是有大小限制,如果计算数字足够大,超出了内存最大范围,就会出现栈溢出错误。...这里500000并不是临界值,只是用了一个足够造成栈溢出数。 如果用尾递归计算阶乘呢?...要做到这一点,需要把函数内部所有用到中间变量改写为函数参数,就像上面的factorial()函数改写一样。 这样做缺点就是语义不明显,要计算阶乘函数,为什么还要另外传入一个参数叫total?...通过这个例子,可能看不出为什么要用柯里化,有什么好处,这个我们以后再谈,这里先引出一个概念。

    10410

    尾调用和尾递归

    3628800 factorial(500000); // Uncaught RangeError: Maximum call stack size exceeded 复制代码 上面是使用递归计算阶乘例子...,操作系统为JS引擎调用栈分配内存是有大小限制,如果计算数字足够大,超出了内存最大范围,就会出现栈溢出错误。...这里500000并不是临界值,只是用了一个足够造成栈溢出数。 如果用尾递归计算阶乘呢?...要做到这一点,需要把函数内部所有用到中间变量改写为函数参数,就像上面的factorial()函数改写一样。 这样做缺点就是语义不明显,要计算阶乘函数,为什么还要另外传入一个参数叫total?...通过这个例子,可能看不出为什么要用柯里化,有什么好处,这个我们以后再谈,这里先引出一个概念。

    1.1K10

    Java方法嵌套与递归调用

    有任何想要讨论和学习问题可联系:zhuyc@vip.163.com。 发布文章风格因专栏而异,均自成体系,不足之处请大家指正。...就是对一个大问题进行拆解,而得到子问题又是同一规则,或同一种操作,比如最简单阶乘计算。假如我们需要计算4阶乘,直接用数学方式写出来是4! = 4 x 3 x 2 x 1。...就像循环需要有一个终止条件一样,递归在不断调用自己,去获取自己所需要结果,那同样要有一个终止条件,这个条件设定通常比较明显,那就是能得到一个确切结果时,就不需要再进行递归调用了,此时直接将具体结果返回就可以了...0情况 public static int getFactorial(int n){ // 递归出口 // 描述当n = 1时,阶乘结果为1,直接返回确定结果...执行过程 如果大家理解了这个分解过程,那么我们已经从代码上实现了这个描述,当n = 1时,直接就可以得到确定结果:1;当n ≥ 2时,通过递归调用(调用自己),将n - 1作为参数传入,代表想要获取

    2.5K31

    C语言函数递归_c语言递归举例

    第二是”归“,最终会一步一步返回。第一次接触递归都会很懵,慢慢理解这个过程就明白了。 什么是递归递归做为一种算法在程序设计语言中广泛应用。...一个过程或函数在其定义或说明中有直接或间接 调用自身 一种方法,它通常把一个大型复杂问题层层转化为一个与原问题相似的规模较小问题来求解, 递归策略 只需少量程序就可描述出解题过程所需要多次重复计算...2.每次递归调用之后越来越接近这个限制条件。 题中限制条件就是(n>9),当我们n通过(n/10)越来越少,直至n=1,无法满足时,递归停止,并开始返回。...具体思路如下: 解释要合理使用递归 通过以上俩个例题,我们可以发现俩个问题: 在使用 fib 这个函数时候如果我们要计算第50个斐波那契数字时候特别耗费时间。...使用 factorial 函数求10000阶乘(不考虑结果正确性),程序会崩溃。 为什么呢? 我们发现 fib 函数在调用过程中很多计算其实在一直重复。

    13.7K32

    C语言进阶指南(6)(函数递归详解)(内含汉诺比塔,青蛙跳台阶问题)

    *欢迎来到博主C语言进阶指南专栏博主id:reverie_ly*@toc递归在了解C语言递归程序之前,想先请大家思考一个数学递归题:已知f(n)=f(n-1)+1,f(0)=0。...那么根据这种数学思想,递归程序思路应该是:将一个程序问题重复拆分为子问题集合,并将这些子问题结果求出并汇总以上例数学题为例,我们可以写出求解这个数学问题程序。...函数运行情况在栈区上为:我们可以发现函数调用时特点是:先调用后销毁,后调用先销毁我们可以利用这个顺序特点来编写程序。...1;}fib(10)=55.斐波那契数列也很好体现了递归缺点之一就是计算繁杂,如果我们尝试使用fib(50),就会发现程序一直在运行,但是结果要很久才能输出(取决于计算算力)。...当n=3时,青蛙可以选择先跳一阶,在跳两阶,或先跳两阶在跳一阶方式共3种当n=4时,青蛙可以选择先跳一阶再用跳三阶方法或先跳两阶再用跳两阶方法共5种。如果这么枚举下去,想要计算到n是很复杂

    11510

    《JavaSE-习题篇二》之七个题目,十六张图,让你不惧递归

    3乘2阶乘,当我们发现这个规律之后便可以推导出求N阶乘递归公式即:N=N * (N-1)。...当递归回来时想要继续这行代码,所以我们使用一个变量存在这个结果。 递归递归相当于在方法体内执行一半,又重新开始了。...✔2.3.2按顺序打印一个数字每一位(例如 123打印出 1 2 3 递归公式推导 数字如果是一位直接输出即可,数组如果大于等于两位以上,我们可以通过/和%来得到相应数字,下面的代码至于为什么是先...,输入一个非负整数,返回组成它数字之和....,当N是一个很大数字计算机就要重复计算很久,为了解决重复计算问题,我们可以使用循环来求斐波纳契数列。

    20610
    领券