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

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

求n的阶乘 ⼀个正整数的阶乘(factorial)是所有⼩于及等于该数的正整数的积,并且0的阶乘为1。...⾃然数n的阶乘写作n!。 分析和代码实现 我们知道n的阶乘的公式:n! = n ∗ (n − 1)! 当 n==0 的时候,n的阶乘是1,其余n的阶乘都是可以通过公式计算。...画图推演 顺序打印一个整数的每一位 输⼊⼀个整数m,按照顺序打印整数的每⼀位。...⽐如: 输⼊:1234 输出:1234 输⼊:52 输出:52 分析和代码实现 在这之前学习循环的时候我们通过不断模10除10可以逆序打印整数的每一位 1234%10就能得到4,然后1234/10...画图推演 递归与迭代 递归是⼀种很好的编程技巧,但是和很多技巧⼀样,也是可能被误⽤的,就像练习一求阶乘一样,看到推导的公式,很容易就被写成递归的形式: 但是,但是 在递归函数调⽤的过程中涉及⼀些运⾏时的开销

18210

Java结合方法栈帧理解递归编程思想

递归的注意事项 一定要保证递归终止的条件,否则会陷入无限调用的噩梦 每次递归,应该可以解决更小的子集问题 阶乘——递归入门案例 阶乘:是最好的递归案例。 0的阶乘=1; ----- 因为1!...1的阶乘=1; 2的阶乘=2*1!=2; 3的阶乘=3*2!=6; 4的阶乘=4*3!=24; 我们发现一个非负数的阶乘 = 其值*(其值-1)!...这个过程需要大量栈帧,我们知道栈帧是需要一定的内存的,所以空间损耗很大; 尾递归优化 尾递归——当递归调用时最后的语句是函数自身,并且没有任何其他的表达式; 对于尾递归,现代编译器会对其做优化,复用栈帧...改写,使用尾递归,复用栈帧: private int factorial2(int i, int result){ if( i <= 1 ){ return result;...a, char b) { printf("%c->%c\n", a, b); }

38610
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【C语言系列】函数递归

    1.1尾递归尾递归是指一个递归函数在调用自身时,该递归调用是函数的最后一条语句。换句话说,函数在调用自身之后不再执行任何操作,而是直接返回递归调用的结果。这种特殊形式的递归称为尾递归。...在下面的例子中,我们逐步体会这2个限制条件三、递归举例3.1举例一:求n的阶乘⼀个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。 自然数n的阶乘写作n!。...当 n==0 的时候,n的阶乘是1,其余n的阶乘都是可以通过公式计算。...,n太大存在栈溢出的现象)如图:下面我们画图推演:3.2举例二:顺序打印一个整数的每一位题目:输入⼀个整数m,按照顺序打印整数的每⼀位。...n是超过1位数的话,就得拆分每⼀位1234%10就能得到4,然后1234/10得到123,这就相当于去掉了4,然后继续对123%10,就得到了3,再除10去掉3,以此类推不断的%10 和 /10 操作,

    20010

    拿下 BAT+华为校招的 200 题 LeetCode 高频题库

    (值对应到下标,再考察下标对应值的情况) 88-合并两个有序数组(双指针) offer66/238-构建乘积数组/除自身以外数组的乘积(拆成两部分相乘的结果) offer64-求1+2+…+n(递归+...offer06-从尾到头打印链表(基本操作)-1 206-反转链表(双指针、递归)-1 92-反转链表2(双指针、递归)-2 24-两两交换链表中的节点(双指针、递归) 25-K 个一组翻转链表 offer22...(快排) 215-数组中的第K个最大元素(快排思想) 283-移动零(双指针-快排思想) 75-颜色分类(快排思想的双指针) 二分查找 题目 35-搜索插入位置(二分查找:https://leetcode-cn.com...11-盛最多水的容器(双指针) 数学 题目 7-整数反转(数学) 9-回文数(数学) 171-Excel表列序号(数学) 728-自除数(简单的循环) 326-3的幂(数学) 263-丑数(数学)...;哈希表) 172-阶乘后的零(这题其实就是数学找规律差不多,进行转换。

    2.7K30

    Python 中的递归,你真的懂了吗?

    用递归求斐波那契数列、汉诺塔 对初学者来讲可能理解起来不太容易,所以我们用阶乘和二分查找来给大家演示一下。  求阶乘:   任何大于1的自然数n阶乘表示方法:     n!...,那么相当于求最多操作次数,就是在区间内,最多将有多少个一半可以抛去、那么就是将100一直除以2,直到不能除为止。 ...尾递归:   如果一个函数中所有递归形式的调用都出现在函数的末尾,我们称这个递归函数是尾递归的。当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归。...当编译器检测到一个函数调用是尾递归的时候,它就覆盖当前的活动记录而不是在栈中去创建一个新的。...尾递归代码示例:  def calc(n):     print(n - 1)     if n > -50:         return calc(n-1) 我们之前求的阶乘是尾递归么?

    74320

    C语言 —— 愿文明如薪火般灿烂 - 函数递归

    递归存在限制条件,当满⾜这个限制条件的时候,递归便不再继续 2. 每次递归调⽤之后越来越接近这个限制条件 2. 递归举例 举例1:求n的阶乘 我们知道n的阶乘的公式: n!...题⽬:计算n的阶乘(不考虑溢出),n的阶乘就是1~n的数字累积相乘 ⼀个正整数的阶乘(factorial)是所有⼩于及等于该数的正整数的积,并且0的阶乘为1, ⾃然数n的阶乘写作n! 5!...这样的思路就是把⼀个较⼤的问题,转换为⼀个与原问题相似,但规模较⼩的问题来求解的 当 n==0 的时候,n的阶乘是1,其余n的阶乘都是可以通过公式计算 n的阶乘的递归公式如下: 那我们就可以写出函数Fact...: 举例2:顺序打印⼀个整数的每⼀位 输⼊⼀个整数m,打印这个按照顺序打印整数的每⼀位 ⽐如: 输⼊:1234 输出:1 2 3 4 输⼊:520 输出:5 2 0 我们可以1234%...10就能得到4,然后1234/10得到123,这就相当于去掉了4,然后继续对123%10,就得到了3,再除10去掉3,以此类推不断的 %10 和 /10 操作,直到1234的每⼀位都得到 但是这⾥有个问题就是得到的数字顺序是倒着的

    21210

    python每日一练(2)

    (1)求阶乘 编写程序,求出某个自然数的阶乘。一个正整数的阶乘是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!...# 求阶乘 # tip 1:递归 def f(n): result = 1 for i in range (1,n+1): result = result * i...return result print(f(0)) #非递归 n = 5 sum = 1 for i in range(1,n+1): sum *= i print(sum) (2) 求圆的周长...使用math库,我们可以进行基本的数学运算(如加、减、乘、除、取模等),以及常见的数学函数(如三角函数、对数函数、指数函数、平方根函数等)。...(异一同零) 按位异或运算可以用来实现数据的加密和解密,它可以将一个数据加密成另一个数据,而解密则是将加密后的数据还原成原来的数据。

    17210

    Python应用之计算阶乘

    一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,通俗的讲也就是按顺序从1乘到n,所得的那个数就是n的阶乘。0的阶乘为1,自然数n的阶乘写作n!。即:0!= 11!= 12!...= n × (n - 1) × (n - 2) ×...× 2 × 1 输入一个整数n,求其阶乘n! 1.1双阶乘 双阶乘用“m!!”表示。...当 m 是自然数时,表示不超过 m 且与 m 有相同奇偶性的所有正整数的乘积。如: 当 m 是负奇数时,表示绝对值小于它的绝对值的所有负奇数的绝对值积的倒数。 当 m 是负偶数时,m!!不存在。...自然数双阶乘比的极限 阶乘的逼近函数公式 对于正整数 2.如何解题 用input函数请用户输入一个整数,因为负数无阶乘,需使用户输入的数为自然数 根据阶乘的特点:n!...若用户输入的数值小于0,输出“负数没有阶乘”;若用户输入的数值等于0,输出“0的阶乘为1”;否则用for循环遍历1 至 a 的整数,在每轮循环中,result都会与循环变量 i 相乘并将乘积结果再赋值给

    1.8K10

    算法分析设计--递归算法

    What’s the 递归算法 定义: 程序直接或间接调用自身的编程技巧称为递归算法(Recursion)。...由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。 注意事项: 递归算法运行效率较低 容易爆栈 一定要设置递归出口不然容易死锁而且爆栈 Why we learn this?...递归是搜索、分治、回溯算法的 例题: 1. Fibonacci数列 我们之前写过递推的方法,这次我们写递归的方法。 PS:矩阵快速幂和母函数是解决此类问题的最快方式,有兴趣的可以去我博客里看看。...题目:将一个整数划分为多个整数想加的形式,并输出有所划分方法的数量。...阶乘 递归思想:n! = n * (n-1)! (直接看公式吧) 首先分析数列的递归表达式: ?

    52710

    Python 递归算法指归

    (n>=2,n∈N,N为正整数集) 阶乘和斐波那契数列的递归算法如下: def factorial(n): if n == 0: # 递归出口 return 1 return n*factorial(n...尾递归 接下来,我们将上面的阶乘递归函数改造一下,仍然用递归的方式实现。为了便于比较,我们把两种算法放在一起。...像 factorial_B() 函数这样,当自身调用是整个函数体中最后执行的语句,且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归(Tail Recursion)。...尾递归函数的特点是在回归过程中不用做任何操作,这个特性很重要,因为大多数现代的编译器会利用这种特点自动生成优化的代码。...分别使用 factorial_A() 和 factorial_B() 计算5的阶乘,下图所示的计算过程,清晰展示了尾递归的优势:不用花费大量的栈空间来保存上次递归中的参数、局部变量等,这是因为上次递归操作结束后

    82520

    C 语言函数递归探秘:从基础概念到复杂问题求解的进阶之路

    如果递归的深度过大(即函数自己调用自己的次数过多),可能会导致栈溢出。例如,在计算一个非常大的整数的阶乘时,如果使用简单的递归函数,可能会因为栈空间不足而导致程序崩溃。...递归的经典案例 5.1 阶乘计算 问题描述:计算正整数的阶乘,即 n! = n × (n-1) × ... × 1。...优化递归:尾递归与动态规划 一、尾递归优化 尾递归的概念 尾递归是一种特殊的递归形式,在尾递归函数中,递归调用是函数体中最后执行的语句,并且在递归调用返回结果后没有其他额外的操作(除了可能的返回值传递)...而尾递归优化是基于一些编译器或解释器的特性,在尾递归情况下,由于递归调用是最后一步操作,编译器可以复用当前栈帧来进行下一次递归调用,而不是创建新的栈帧。...不过,需要注意的是,并非所有的编译器都支持尾递归优化,例如在一些常见的C语言编译器中,默认可能不进行尾递归优化,需要手动开启特定的编译选项或者采用一些特殊的编程技巧来模拟尾递归优化效果。

    25810

    03--图解数据结构之双链表实现容器

    零、前言 链表是一种数据结构,用来承载数据,每个表节点装载一个数据元素 双链表是每个节点出来数据元素外还分别持有前、后两个节点的引用 为了统一节点的操作,一般在真实链表的首尾各加一个虚拟节点,称为头节点和尾节点...一、链表的操作 下图是一个三个节点的双链表 ?...双链表.png /** * 作者:张风捷特烈 * 时间:2018/9/18 0018:7:35 * 邮箱:1981462002@qq.com * 说明:双链表 */ public class...,从而从链表上全部删除 1---实例化头结点 2---实例化尾节点,并将prev指向头 3---头结点的next指向尾节点 4---链表长度置零 ?...= tailNode; //链表长度置零 size = 0; } ---- 4.获取操作:getNode 思路:链表查找只能一个一个挨着找,就像排队报数样。

    61950

    面试官:说一说递归如何优化-尾递归优化

    编者荐语:本文旨在帮助大家掌握递归的性能优化方案——尾递归优化,以及如何对下列函数用尾递归进行优化?...,是一个阶乘函数,计算n的阶乘,最多需要保存n个调用记录,复杂度 O(n) 。...,每次要进行阶乘递归操作的话,就只有最后一个函数的函数执行上下文,不会造成栈溢出,意思就是把10的阶乘,分开10个函数来执行,分别创建10个函数执行上下文。...这样做的缺点就是不太直观,第一眼很难看出来,为什么计算5的阶乘,需要传入两个参数5和1? 两个方法可以解决这个问题。 方法一:是在尾递归函数之外,再提供一个正常形式的函数。...五、尾递归优化的魅力 从下图中,我们就可以看出,单单是求5的阶乘,就提升了5ms之快,可以说厉害的惊人了! ? 六、使用条件 - 严格模式 ES6的尾调用优化只在严格模式下开启,正常模式是无效的。

    4.4K22

    函数的递归

    递归举例  2.1 举例1: 求n的阶乘  ⼀个正整数的阶乘(factorial)是所有⼩于及等于该数的正整数的积,并且0的阶乘为1。⾃然数n的阶乘写作n!。...题⽬:计算n的阶乘(不考虑溢出),n的阶乘就是1~n的数字累积相乘。  2.1.1 分析和代码实现 我们知道n的阶乘的公式:n! =  n ∗ (n − 1)! ...n的阶乘的递归公式如下: 那我们就可以写出函数Fact求n的阶乘,假设Fact(n)就是求n的阶乘,那么Fact(n-1)就是求n-1的阶 乘,函数如下: 住:运⾏结果(这⾥不考虑n太⼤的情况,n太⼤存在溢出...) 2.1.2画图推演 2.2 举例2: 顺序打印⼀个整数的每⼀位 输⼊⼀个整数m,按照顺序打印整数的每⼀位。...如果n是⼀位数,n的每⼀位就是n⾃⼰  n是超过1位数的话,就得拆分每⼀位 1234%10就能得到4,然后1234/10得到123,这就相当于去掉了4 然后继续对123%10,就得到了3,再除10去掉3

    19310

    ES6-标准入门·语法的扩展

    Math.trunc 方法用于去除一个数的小数部分,返回整数部分。 Math.sign 方法用来判断一个数到底是正数、负数,还是零。对于非数值,会先将其转换为数值。其返回值有 5 种情况。...尾递归 函数调用自身称为递归。如果尾调用自身就称为尾递归。 递归非常耗费内存,因为需要同时保存成百上千个调用帧,很容易发生“栈溢出”错误(stack overflow)。...尾递归的实现往往需要改写递归函数,确保最后一步只调用自身。做到这一点的方法,就是把所有用到的内部变量改写成函数的参数。...对于其他支持“尾调用优化”的语言(比如 Lua、ES6),只需要知道循环可以用递归代替,而一旦使用递归,就最好使用尾递归。 严格模式 ES6 的尾调用优化只在严格模式下开启,正常模式下是无效的。...尾递归优化的实现 尾递归优化只在严格模式下生效,在正常模式下,可以自己实现尾递归优化。

    1.2K40

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

    2.3递归题目 ✔2.3.1递归求 N 的阶乘 递归公式的推导 我们都知道4的阶乘是对于1至4的每个数的乘积,3的阶乘是对于1至3的每个数的乘积,从中我们会发现4的阶乘其实可以写成4乘3的阶乘,3的阶乘可以写成...3乘2的阶乘,当我们发现这个规律之后便可以推导出求N的阶乘的递归公式即:N=N * (N-1)。...public class Demo2 { public static void main(String[] args) { System.out.println("请输入一个整数...,输入一个非负整数,返回组成它的数字之和....当只有1个盘子时 移动顺序:A -> C 当只有2个盘子时 移动顺序:A ->B A->C B->C 当只有3个盘子时 移动顺序: A ->C A->B C->B A->C B->A B->C A-

    23410

    通过阶乘获取一个一维PHP数组中全部的组合情况

    在数学中,一个数的阶乘(记作 $n!$)是所有小于等于 $n$ 的正整数的乘积。对于数组的组合问题,我们可以借鉴阶乘的思想,通过递归或迭代的方式,获取一个一维数组的所有组合情况。...这种方法不仅适用于数学计算,也在计算机编程中具有广泛的应用场景,如密码学、算法设计和测试用例生成等。在本文中,我们将深入探讨如何利用 PHP 的递归函数实现一维数组的全组合功能。...php/** * 使用阶乘原理,通过阶乘获取一个一维数组中全部的组合情况 * */namespace App\Handlers;class FactorialHandler{ /** *...= 1*2*3*4*5…………*(n-1)*n $combineArr = []; // 遍历数组,递归获取除当前元素外的所有组合 foreach ($arr...,我们还可以通过下方的代码实现一维数组的所有组合情况,这次我们采用的是递归深度优先搜索的方法。

    17110

    【Java 基础篇】深入理解Java递归:从小白到专家

    递归是一种解决问题的方法,其中一个函数通过调用自身来解决更小规模的问题,直到达到基本情况为止。这种自我调用的方式使得递归成为处理许多问题的有效工具。在讨论递归之前,让我们来看一个经典的例子:阶乘。...阶乘的递归实现 阶乘是一个自然数的乘积,从1到该数的所有正整数的乘积。用数学表示为n! = n * (n-1) * (n-2) * ... * 1。在Java中,可以使用递归来计算阶乘。...基本情况(Base Case) 基本情况是递归算法中的停止条件。在阶乘的例子中,基本情况是当n等于1时,返回1。基本情况的存在是防止递归无限循环的关键。 2....递归的应用 递归不仅仅用于计算阶乘,它在计算机科学和编程中有许多实际应用。以下是一些常见的递归应用: 1. 斐波那契数列 斐波那契数列是一个经典的递归问题,其中每个数字是前两个数字的和。...在一些编程语言中,尾递归优化可以帮助减少递归调用的开销。 总结 通过本文,我们深入探讨了Java中的递归。我们从基本概念开始,讨论了递归的要素和执行过程,并展示了递归在不同领域的应用。

    1.2K20
    领券