首页
学习
活动
专区
圈层
工具
发布

##C语言——学习攻略:函数递归思想的解析及应用

前言:在前一章学习了函数的相关概念,在本章将会接上篇,分享函数中重要的部分——函数递归,一起加油吧! 1....别急,在下面的例子中更好的理解一下。 2. 补充:栈溢出 --什么是栈溢出? --栈溢出指程序在执行时,调用栈(Call Stack)的内存空间被耗尽,导致程序崩溃。...--画图演示 3.2 递归实现顺序打印整数的每一位 解题思路—— --需求分析 --将整数如:521,正序打印每一位——5 2 1; --实现方案 变量设置 --变量n接收输入...; 主体结构 --设计函数: --联想到之前实现过逆序打印整数的每一位——使用%10得到最低的位数、/10得到去掉最低位数的数值、再循环实现; --设置终止条件...,由n/10得到下一次递归的数值,则n要保证为两位数,即n>=9; --因为最后的回归是从最后一次递推结束后将值返回上一级函数调用,所以直接用n%10进行倒序取余,回归后为正序

29110

【C语言】函数递归

3.1 实例 1:求 n 的阶乘 一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且规定 0 的阶乘为 1。自然数 n 的阶乘记作 n!...问题分析 输入一个整数 m,要求按照顺序打印出该整数的每一位。...要解决这个问题,首先需要思考如何获取整数的每一位。对于一个多位数,通过取余运算(%10)可以得到其最低位,通过整除运算(/10)可以去掉最低位。...> 9) { // 递归调用:先打印n去掉最低位后的数字的每一位 Print(n / 10); } // 打印n的最低位 printf(...4.5 递归与迭代的选择建议 当问题的递归实现简洁易懂,且递归层次不深,不存在大量重复计算时,可以选择递归。例如求 n 的阶乘、顺序打印整数的每一位等。

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

    关于我、重生到500年前凭借C语言改变世界科技vlog.8——函数递归

    ,将复杂的程序化成简单的代码格式,也就是化成一个个子问题求解,知道子程序不再被分解,递归就结束了 2.递归的限制条件 值得注意的是,递归也存在限制条件 • 递归存在限制条件,当满足这个限制条件的时候,...当 n == 0 的时候,此时 n 的阶乘是 1 ,n > 0时阶乘可根据公式计算 那么我们可以写出阶乘函数 Fact ,Fact(n) 是求 n 的阶乘,那么Fact(n-1)就是求 n-1 的阶乘...3.2 顺序打印一个整数的每一位 输入⼀个整数m,按照顺序打印整数的每⼀位 如果n是⼀位数,n的每⼀位就是n自己 n是超过1位数的话,就得拆分每⼀位 比如: 1234%10就能得到4,然后...1234/10得到123,这就相当于去掉了4 然后继续对123%10,就得到了3,再除10去掉3,以此类推 不断的 %10 和 /10 操作,直到1234的每一位都得到 但是这里有个问题就是得到的数字顺序是倒着的...,当函数调用完之后依次从最后一个子程序往第一个程序打印 4.递归与迭代 Fact函数是可以产生正确的结果,但是在递归函数调用的过程中涉及一些运行时的开销 在C语言中每一次函数调用,都需要为本次函数调用在内存的栈区

    33810

    C语言编程实战:大家一起云刷题 - day3

    前言: 本系列博客将会更新一些每日的刷题代码以及对题目的解读,帮助大家更好地理解编程思路和实现方法 题目: 1. n的阶乘 递归和非递归分别实现求n的阶乘(不考虑溢出的问题) 阶乘的定义是n!...打印一个整数的每一位 递归方式实现打印一个整数的每一位 要打印一个整数的每一位(如951打印为9 5 1),可以通过递归不断提取高位数字,直到剩下最后一位时开始打印,从而实现从高位到低位的输出。...(n < 10) { printf("%d ", n); } else { //先递归处理去掉最后一位的数(获取高位) print(n / 10); //再打印最后一位(通过取余...单身狗1 在一个整型数组中,只有一个数字出现一次,其他数组都是成对出现的,请找出那个只出现一次的数字。...通过循环取余和除法提取每一位,分别存入奇数位和偶数位的数组,最后打印即可。

    11910

    【C语言】函数递归(含扫雷进阶思路)

    时,又调用了main函数,也就是又从main函数的头开始,然后再打印,最后一陷入死递归,如果代码突然结束,可能就是程序一直在创建函数栈帧,导致了栈溢出 二、递归的使用思路和限制条件 1.递归的使用思路...在下⾯的例⼦中,我们逐步体会这2个限制条件 三、递归的举例 举例1:求n的阶乘     ⼀个正整数的阶乘(factorial)是所有⼩于及等于该数的正整数的积,并且0的阶乘为1。...如果n是⼀位数,n的每⼀位就是n⾃⼰,n是超过1位数的话,就得拆分每⼀位     拆分的方法之前也讲到过,就是%10可以得到最后一位,/10可以去掉最后一位,但是我们要按照顺序打印,一个思路就是直接按上面的方法处理...,最后帮我们实现任务     比如我们现在有一个函数叫print,它的作用就是帮我们将一个整数的每一位给打印出来,假如打印1234的每一位,那么就可以拆分成print(123) + print(4),...:     其实递归程序会不断的展开,在展开的过程中,我们很容易就能发现,在递归的过程中会有重复计算,⽽且递归层次越深,冗余计算就会越多。

    36610

    每日算法系列【LeetCode 1006】笨阶乘

    题目描述 通常,正整数 n 的阶乘是所有小于或等于 n 的正整数的乘积。例如,factorial(10) = 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1。...相反,我们设计了一个笨阶乘 clumsy:在整数的递减序列中,我们以一个固定顺序的操作符序列来依次替换原有的乘法操作符:乘法(*),除法(/),加法(+)和减法(-)。...另外,我们使用的除法是地板除法(floor division),所以 10 * 9 / 8 等于 11。这保证结果是一个整数。 实现上面定义的笨函数:给定一个整数 N,它返回 N 的笨阶乘。...这道题可以用简单的数学计算来优化一下,首先笨阶乘数学形式是下面这样的: 好像看不出什么东西,那么我们先去掉取整符号看看: 所以当 时,取整符号可以直接去掉: 所以我们就讨论 时的情况,笨函数可以写成...但是考虑到取整函数只有在 时才等于 ,也就是最后剩余的项数大于 时才行。那么上面的 种情况的 、 两种,就要特殊处理一下前一个取整结果: ,也就是最后剩余 项时, 。

    62310

    c语言回顾-函数递归

    0; } 上述就是⼀个简单的递归程序,只不过上面的递归只是为了演示递归的基本形式,不是为了解决问 题,代码最终也会陷入死递归,导致栈溢出(Stack overflow)。...2.递归举例 2.1 举例1:求n的阶乘 一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。 自然数n的阶乘写作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去掉...其实递归程序会不断的展开,在展开的过程中,我们很容易就能发现,在递归的过程中会有重复计算,而且递归层次越深,冗余计算就会越多。

    25110

    试题 算法训练 阶乘

    试题 算法训练 阶乘 资源限制 内存限制:512.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述   一个整数n的阶乘可以写成n!...,它表示从1到n这n个整数的乘积。阶乘的增长速度非常快,例如,13!就已经比较大了,已经无法存放在一个整型变量中;而35!就更大了,它已经无法存放在一个浮点型变量中。因此,当n比较大时,去计算n!...是非常困难的。幸运的是,在本题中,我们的任务不是去计算n!,而是去计算n!最右边的那个非0的数字是多少。例如,5! = 12345 = 120,因此5!最右边的那个非0的数字是2。再如:7!...最右边的那个非0的数字是4。请编写一个程序,输入一个整数n(n的那个非0的数字是多少。   输入格式:输入只有一个整数n。   ...输出格式:输出只有一个整数,即n! 最右边的那个非0的数字。

    20100

    函数递归【C语言】

    0; } 上述就是一个简单的递归程序,只不过上面的递归只是为了演示递归的基本形式,不是为了解决问题,代码最终也会陷入死递归,导致栈溢出(Stack overflow)。...递归的举例 2.1 举例1:求n的阶乘 一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。 自然数n的阶乘写作n!。...,n太大存在溢出): 2.1.2 画图推演 2.2 举例2:顺序打印一个整数的每一位 输入一个整数m,按照顺序打印整数的每一位。...分析如下: 1234%10就能得到4,然后1234/10得到123,这就相当于去掉了4,然后继续对123%10,就得到了3,再除10去掉3,以此类推,不断的%10和/10操作,直到1234的每一位都得到...其实递归程序会不断的展开,在展开的过程中,我们很容易就能发现,在递归的过程中会有重复计算,而且递归层次越深,冗余计算就会越多。

    43010

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

    2.递归举例 2.1 举例1 :求n的阶乘 一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。 自然数n的阶乘写作n!。...在这之后,程序开始回归,首先回归到Fact(1)= 1 * Fact(0),然后程序继续回归,直到Fact(5),所以最终计算出5的阶乘。...2.2 举例2 :顺序打印一个整数的每一位 输入⼀个整数m,打印这个按照顺序打印整数的每⼀位。...1234%10就能得到4,然后1234/10得到123,这就相当于去掉了4,然后继续对123%10,就得到了3,再除10去掉3,以此类推,不断的 %10 和 /10 操作,直到1234的每⼀位都得到;...其实递归程序会不断的展开,在展开的过程中,我们很容易就能发现,在递归的过程中会有重复计算,而且递归层次越深,冗余计算就会越多。

    46310

    函数的递归调用(零基础理解递归)

    递归的举例 举例1: 求n的阶乘 一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积, 并且0的阶乘为1. 自然数n的阶乘写作n!...scanf("%d", &n); int result = Fact(n); printf("%d\n", result); return 0; } 运行结果: 画图推演: 举例2: 顺序打印一个整数的每一位...题目: 输入一个整数m, 按照顺序打印整数的每一位 比如: 输入:1234 输出:1 2 3 4 输入:520 输出:5 2 0 分析和代码 这个题目, 放在我们面前, 首先想到的是, 怎么得到这个数的每一位呢...如果n是一位的话, n的每一位就是n自己 n如果超过1位的话, 就拆分每一位 1234%10就能得到4, 然后1234/123, 这就相当于去掉了4, 以此类推, 不断的%10和/10的操作, 直到1234...其实递归程序会不断的展开,在展开的过程中,我们很容易就能发现,在递归的过程中会有重复计 算,⽽且递归层次越深,冗余计算就会越多。

    63910

    【C语言】函数递归

    0; } 上述就是一个简单的递归程序,只不过上面的递归只是为了演示递归的基本形式,不是为了解决问题,代码最终也会陷入死递归,导致栈溢出。...递归举例 3.1 举例1:求n的阶乘 计算n的阶乘(不考虑溢出),n的阶乘就是1~n的数字累积相乘。 3.1.1 分析和代码实现 我们知道n的阶乘的公式: n! = n ∗ (n − 1)!...⼀位 输入⼀个整数m,打印这个按照顺序打印整数的每一位。...如果n是一位数,n的每一位就是n自己 n是超过1位数的话,就得拆分每一位 1234%10就能得到4,然后1234/10得到123,这就相当于去掉了4,然后继续对123%10,就得到了3,再除10去掉3...其实递归程序会不断的展开,在展开的过程中,我们很容易就能发现,在递归的过程中会有重复计算,而且递归层次越深,冗余计算就会越多。

    46910

    【C语言系列】函数递归

    1.1尾递归尾递归是指一个递归函数在调用自身时,该递归调用是函数的最后一条语句。换句话说,函数在调用自身之后不再执行任何操作,而是直接返回递归调用的结果。这种特殊形式的递归称为尾递归。...在下面的例子中,我们逐步体会这2个限制条件三、递归举例3.1举例一:求n的阶乘⼀个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。 自然数n的阶乘写作n!。...,n太大存在栈溢出的现象)如图:下面我们画图推演:3.2举例二:顺序打印一个整数的每一位题目:输入⼀个整数m,按照顺序打印整数的每⼀位。...直到得到1234的每一位。...其实递归程序会不断的展开,在展开的过程中,我们很容易就能发现,在递归的过程中会有重复计算,而且递归层次越深,冗余计算就会越多。

    45510

    【C语言】递归详解

    0; } 上述就是⼀个简单的递归程序,只不过上⾯的递归只是为了演示递归的基本形式,不是为了解决问题,代码最终也会陷⼊死递归,导致栈溢出。...4.2 顺序打印一个整数的每一位 输⼊一个整数n,打印这个按照顺序打印整数的每⼀位 输⼊:1234 输出:1 2 3 4 输⼊:521 输出:5 2 1 4.2.1 分析和代码实现 这个题目,放在我们面前...,首先想到的是,怎么得到这个数的每一位呢?...1234%10就能得到4,然后1234/10得到123,这就相当于去掉了4; 然后继续对123%10,就得到了3,再除10去掉3,以此类推; 不断的 %10 和 \10 操作,直到1234的每⼀位都得到...(12)打印12的每一位,再打印得到的3 直到Print打印的是一位数,直接打印就行。

    1.2K10

    函数的递归

    return 0; } 上述就是⼀个简单的递归程序,只不过上⾯的递归只是为了演⽰递归的基本形式,不是为了解决问 题,代码最终也会陷⼊死递归,导致栈溢出。...下面我们看图来感受一下: 3.2 顺序打印一个整数的每一位 输入一个整数m,按顺序打印它的每一位。...例如我们输入:520 打印结果为:5 2 0 这个问题放到我们面前,我们首先思考的是怎么获得这个数的每一位呢?如果n是一位数,那么每一位就是它自己。如果n是多位数那就要拆分每一位。...1234%10就能得到4,然后1234/10得到123,这就相当于去掉了4 然后继续对123%10,就得到了3,再除10去掉3,以此类推 不断的 %10 和 \10 操作,直到1234的每⼀位都得到;...其实递归程序会不断的展开,在展开的过程中,我们很容易就能发现,在递归的过程中会有重复计 算,⽽且递归层次越深,冗余计算就会越多。

    11910

    优化阶乘算法的探索

    如果所要求的数是n,则阶乘式是1×2×3×……×n,设得到的积是x,x就是n的阶乘。在表示阶乘时,就使用“!”来表示,如n阶乘,就表示为n!。...但具体怎样对两个都比较大的数的作乘法运算呢?这就要利用大整数的高精度运算。如A,B都是位数比较多的大整数,现在要作A*B运算。...在这里我们也可以模拟45*12,把A中每一位从低到高与B中的个位相乘,与后再与B中的十位相乘,依次类推,最后把所有的结果对应相加就可以得到所要求的结果了。...的阶乘需要2000Ms左右,所以这种算法并不能解决实际问题。考虑到上面的程序是一位一位的把一个大数存放下来,然后相乘时也是一位一位的进行的。...N(0~20000):/n”); } return 0; } 当然在程序中可以把存放大数的数组定义成长整型(long)则每一个数组元素可以存放更多位,10000!

    79420

    C语言之函数递归

    include int main() { printf("hehe\n"); main();//main函数中又调用了main函数 return 0; }  上面代码就是一个简单的递归程序...二、递归举例 举例1.求n的阶乘(不考虑溢出),0的阶乘为0 Ⅰ.分析 n的阶乘公式:n!=n*(n-1)! 举例:5!=5*4*3*2*1            4!...,n太大存在溢出 分析:①这里递归的条件是:n>0,递归停下来的条件是:n=0            ②不断接近跳出条件 Ⅲ.画图推演 举例2.顺序打印一个整数的每一位 输入一个整数n,打印这个按照顺序打印整数的每一位...1234%10就得到4,然后1234/10就等到123,就相当于去掉了4 然后继续对123%10就得到了3,再除10就去掉了3,以此类推,不断%10和/10,直到得到每一位 但是这样得到的数字顺序是倒着的...其实递归程序会不断展开,在展开的过程中,我们很容易就能发现,在递归的过程中会有重复计算,而且递归层次越深,冗余计算就会越多。

    46810

    【C语言】函数递归 (包你懂的)

    return 0; } 上述就是一个简单的递归程序,只是为了演示递归的基本形式,不做它用。...3.2 举例2:顺序打印一个整数的每一位 真热打铁,接着来!!!...题目:输入一个整数,按照顺序打印整数的每一位 3.2.1 分析和代码实现 首先看到这道题目,我们就会先想该如何将整数的每一位先弄出来,之后再打印。...其实把整数每一位都弄出来不难,思路如下: 如果n是一位数,n的每一位就是n自己 n是超过1位数的话,就得拆分每一位 比如:现在n=1234,那么我们可以这么做: 先1234%10,可以得到个位数上的...然后继续对123%10,得到3,再除10去掉3,以此类推。 但是这里有个问题,这样做的话,我们打印出来的数字顺序是倒着的。

    30810

    c语言从入门到实战——函数递归

    函数递归 前言 函数递归是指一个函数直接或间接地调用自身,以解决问题的一种方法。在C语言中,函数递归可以用来计算阶乘、斐波那契数列等数学问题。...0; } 上述就是一个简单的递归程序,只不过上面的递归只是为了演示递归的基本形式,不是为了解决问题,代码最终也会陷入死递归,导致栈溢出(Stack overflow)。...,n太大存在溢出): 3.1.2 画图推演 3.2 举例2: 顺序打印一个整数的每一位 输入一个整数m,打印这个按照顺序打印整数的每一位。...1234%10就能得到4,然后1234/10得到123,这就相当于去掉了4 然后继续对123%10,就得到了3,再除10去掉3,以此类推 不断的 %10 和 \10 操作,直到1234的每一位都得到...其实递归程序会不断的展开,在展开的过程中,我们很容易就能发现,在递归的过程中会有重复计算,而且递归层次越深,冗余计算就会越多。

    54710

    函数递归与迭代(经典斐波那契数)

    递归我个人感觉更像是一种解决问题的方法,与算法类似,这里拿C语言举例,递归就是函数自己调用自己 展示一个史上最简单的C语言递归代码 可以发现程序陷入了死递归,最终停下来,这是什么原因呢?...有一种特殊情况就是:当n==0的时候,n的阶乘是1,而其余n的阶乘都是可以通过上面的公式计算。...2.2 顺序打印一个整数的每一位 输入一个整数n,按照顺序打印整数的每一位 输入:1234 输出:1 2 3 4 输入:520 输出:5 2 0 2.2.1 分析和代码实现 看到这个题目是不是很熟悉,...之前发了一篇文章:怎么逆序打印每一位,逆序当时是这样打印的: 如果n是一位数,n的每一位就是n自己 n如果超过1位数的话,就得拆分每一位 1234%10就能得到4,然后1234/10得到123,这就相当于去掉了...4 然后继续对123%10,就得到了3,再除10去掉3,以此类推 不断%10和/10操作,直到1234的每一位都得到 基于之前的经验,我们就有了灵感,可以发现一个数字的最低位是最容易得到的,通过%10

    25510
    领券