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

函数递归和简单例子(c语言)

什么是递归 递归是学习C语⾔函数绕不开⼀个话题,那什么是递归呢? 递归其实是⼀种解决问题⽅法,在C语⾔中,递归就是函数⾃⼰调⽤⾃⼰。...我们写一个简单递归 #include int main() { printf("hehe\n"); main();//main函数中⼜调⽤了main函数 return 0...; } 我们看到这个递归是每次都调用自己main()函数没有限制条件所以一直打印hehe....三例子:用递归求阶乘 int fun(int n) { if (n == 0) { return 1; } else { return fun(n - 1) * n; } } int...四 递归特点 运用少量代码来运算 思路清晰,化大为小 要有限制条件,每一次递归会逼近停止条件,要不会死循环 总结 其实递归程序会不断展开,在展开过程中,我们很容易就能发现,在递归过程中会有重复计算

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

    【C语言】函数递归例子1汉诺塔问题

    昨天我总结函数递归说到了两个例子,今天我们就来看一下其中之一汉诺塔 1.汉诺塔是什么? 汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说益智玩具。...我之前总结道函数递归思想是把大规模事化小规模事过程,并且都含有一个相同规律点从而不断化小下去,所以我们先假设n为一个数。...5.运用代码实现汉诺塔 创建Hanoi函数 首先在main函数里规定一个Hanoi函数,这个函数用来表示汉诺塔整个过程,根据汉诺塔玩法其实整个过程就是将初始A上盘子通过B移动到C上 所以需要调用实参就是三个柱子...柱移动到C柱上 Hanoi('A', 'B', 'C', n); return 0; } Hanoi函数递归 在Hanoi函数内部,我们首先要分情况讨论,如果n=1时,我们是不是只需要将A--->...C(A移动到C)移动需要创建一个move函数,只有n>1时才符合我们得出结论,然后再按照结论得出三步骤,根据我们得到结论我们是不是可以发现我们结论符合Hanoi函数递归条件从而不断重复这三个步骤

    6910

    例子理解递归

    递归函数体中调用自己,在使用递归同时,一定要注意结束条件,如果不加控制,将无休止调用自己,直到堆栈溢回出,因为函数每调用一次就会在栈上创建一个栈帧,函数调用结束后就会弹出该栈帧,而栈大小不是无限...然后想要运用递归,最重重重要口诀,要记住: 明确这个递归函数作用(不需要写出具体代码) 找到递归结束条件 找出函数等价关系式或最小递归模型 不要试图跟踪递归过程 ---- 下面通过运用口诀来解决由易到难几道题来理解递归...这个数列从第3项开始,每一项都等于前两项之和,这个也是在递归中常说一道题。 第一步: 明确这个递归函数作用,这个函数作用是什么?就是输出第n项值。...第一步,确实递归函数作用,求n级台阶有多少种跳法。 第二步,确实结束条件,当台阶等于0,1,2,分别有0,1,2种方法,我们可以将这个结束条件进行整理。...** argv) { while (1) { sum = 0; int x; cin >> x; fun(x, 'A', 'B', 'C'); } return 0; } } 例子就举到这里

    1.1K10

    通过例子递归

    耳熟能详例子 生活中,有不少递归例子,我们学习递归时候,要善于把生活中例子转化为编程语言实现。这样既锻炼了编程思维,又加深了自己对于概念理解。...首先我们来看什么是递归函数:一个函数在其内部调用函数本身,这个函数就被称为递归函数。...函数会无限递归下去,直到栈溢出,编译器报错: maximum recursion depth exceeded。...在 Python 交互模式下,如果你想看到系统支持递归层数,可以输入: >>> import sys >>> sys.getrecursionlimit() 3000 练手小例子 大家可以自己拿下面的小例子...比如说 fibonacci(20) 会逐级递归,以至于调用很多次 fibonacci(1),fibonacci(2)……,我们把这些结果保存起来,使得我们不必重复计算相同函数,使得递归可以处理更多数据

    69910

    【C语言】函数递归例子2青蛙跳台阶问题

    接下来我们来看一下第二个例子青蛙跳台阶 青蛙跳台阶问题  这个问题经常在各类面试中看到。一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级台阶总共有多少种跳法。...是实践函数递归典型问题 分析问题 我们先假设有n个台阶,如果n=1,那么只有一种跳法,如果n=2,那么就有两种跳法。...所以当有n个台阶时,假如青蛙第一次跳了1个台阶,那么剩下了n-1个台阶;假如青蛙第一次跳了2个台阶,那么剩下了n-2个台阶 那我们是不是可以这么想跳n个台阶跳法=跳n-1个台阶跳法+跳n-2个台阶跳法...1; } else if (n == 2) { return 2; } else if (n > 2) { return tiao(n - 1) + tiao(n - 2);//递归

    11210

    java递归查询父节点_java递归例子

    如果当前用户没有设置过该教材章课节,就为其设置默认第一章、第一课、第一节。 数据库设计:此处将章课节所有信息存放到一张表中,可递归查询。最上一级章parentid是教材id。...二、解决 已设置我们这里不讨论,只需要到库中查询对应章课节即可。...那么对于默认第一章第一课第一节,我们这里使用一个递归函数将查询结果存放到一个list中 /*** 根据给定id,查询其下第一课、第一节(不只适用于章课节三级,如果下面还有级别的目录,也可查 * *...= null) { list.add(c); getSubChapter(c.getId(), list);//递归查询 } } }catch(Exception e) { logger.error...(e.getMessage(),e); } } 递归查询特点:函数方法自己掉用自己,通过某个条件判断跳出最后一个被调用递归方法。

    2.3K10

    函数递归

    递归是什么? 递归是学习C语⾔函数绕不开⼀个话题,那什么是递归呢? 递归其实是⼀种解决问题方法,在C语⾔中,递归就是函数⾃⼰调⽤⾃⼰。 ...写⼀个史上最简单C语⾔递归代码: 可以看到,函数在无限递归下去,直到内存栈区占满。...递归与迭代 递归是⼀种很好编程技巧,但是和很多技巧⼀样,也是可能被误⽤,就像举例1⼀样,看到推导 公式,很容易就被写成递归形式: Fact函数是可以产⽣正确结果,但是在递归函数调⽤过程中涉及...函数不返回,函数对应栈帧空间就⼀直占⽤,所以如果函数调⽤中存在递归调⽤的话,每⼀次递归 函数调⽤都会开辟属于⾃⼰栈帧空间,直到函数递归不再继续,开始回归,才逐层释放栈帧空间。...所以如果采⽤函数递归⽅式完成代码,递归层次太深,就会浪费太多栈帧空间,也可能引起栈溢 出(stack overflow)问题。

    5010

    递归函数

    递归 递归就是一个函数在它函数体内调用它自身。执行递归函数将反复调用其自身,每调用一次就进入新一层。递归函数必须有结束条件。...注: 递归时候,每次调用一个函数,计算机都会为这个函数分配新空间,这就是说,当被调函数返回时候,调用函数变量依然会保持原先值,否则也不可能实现反向输出。...特点: 递归函数特点 每一级函数调用时都有自己变量,但是函数代码并不会得到复制,如计算5阶乘时每递推一次变量都不同; 每次调用都会有一次返回,如计算5阶乘时每递推一次都返回进行下一次; 递归函数中...,位于递归调用前语句和各级被调用函数具有相同执行顺序; 递归函数中,位于递归调用后语句执行顺序和各个被调用函数顺序相反; 递归函数中必须有终止语句。...综上: 函数调用时候,每次调用时要做地址保存,参数传递等,这是通过一个递归工作栈实现。具体是每次调用函数本身要保存内容包括:局部变量、形参、调用函数地址、返回值。

    69930

    递归函数

    如果一个函数在内部调用自身,这个函数就叫做递归函数 递归函数简单定义如下: def recursion(): return recursion() 这只是一个简单定义,什么也做不了。...,当然,我们需要能实际做事情函数,有用递归函数应该满足如下条件: (1)当函数直接返回值时有基本实例(最小可能性问题) (2)递归实例,包括一个或多个问题最小部分递归调用 使用递归关键在于将问题分解为小部分...,递归函数有点是定义简单,逻辑清晰。...理论上,所有递归函数都可以写成循环方式,不过循环逻辑不如递归清晰。 使用递归函数需要注意仿制栈溢出,在计算机中,函数调用通过栈(stack)这种数据结构实现。...还有一种方法,就是通过尾递归优化,事实上尾递归和循环效果一样,把循环看成一种特殊尾递归函数也是可以

    69910

    递归函数优化

    本文作者:IMWeb 寒纱阁主 原文出处:IMWeb社区 未经同意,禁止转载 递归函数是一个函数自我调用而构成,如下是一个典型递归阶乘函数: function factorial(num)...原因就出在return num*factorial(num-1)这一句上,这种写法使得函数太过紧密,一旦将函数保存到另一个变量中,并将原变量设置为null,factorial便不再是函数,因此会报错。...解决方法:arguments.callee arguments.callee是一个指向正在执行函数指针,修改后代码如下: function factorial(num){ if(num<=1){...return 1; }else{ return num*arguments.callee(num-1); } } 这样就实现了更松散耦合,解决了问题。...f 表达式,并将其赋值给factorial,这样一来即便将函数赋值给其他变量,函数名 f 依然有效。

    70430

    递归函数优化

    本文作者:IMWeb 寒纱阁主 原文出处:IMWeb社区 未经同意,禁止转载 递归函数是一个函数自我调用而构成,如下是一个典型递归阶乘函数: function factorial(num)...原因就出在return num*factorial(num-1)这一句上,这种写法使得函数太过紧密,一旦将函数保存到另一个变量中,并将原变量设置为null,factorial便不再是函数,因此会报错。...解决方法:arguments.callee arguments.callee是一个指向正在执行函数指针,修改后代码如下: function factorial(num){ if(num<=1){...return 1; }else{ return num*arguments.callee(num-1); } } 这样就实现了更松散耦合,解决了问题。...f 表达式,并将其赋值给factorial,这样一来即便将函数赋值给其他变量,函数名 f 依然有效。

    930100

    函数递归

    如果一个函数在内部调用自身本身,则该函数就是递归函数 递归优缺点   优点:使用递归函数优点是逻辑简单清晰      理论上,所有的递归函数都可以写成循环方式,但循环逻辑不如递归清晰...  缺点:过深调用会导致栈溢出 栈溢出   使用递归函数需要注意防止栈溢出   在计算机中,函数调用是通过栈(stack)这种数据结构实现   每当进入一个函数调用,栈就会加一层栈帧...,每当函数返回,栈就会减一层栈帧   由于栈大小不是无限,所以,递归调用次数过多,会导致栈溢出 尾递归   解决递归调用栈溢出方法是通过尾递归优化   事实上尾递归和循环效果是一样...,所以,把循环看成是一种特殊递归函数也是可以   尾递归是指,在函数返回时候,调用自身本身,并且return语句不能包含表达式   例如,def fun(n) : retrun n*fun(n-...尾递归事实上和循环是等价,没有循环语句编程语言只能通过尾递归实现循环 Python标准解释器没有针对尾递归做优化,任何递归函数都存在栈溢出问题 使用示例: def fact(n):   return

    94910

    js 递归调用

    程序员不止眼前逻辑和代码,还有底层框架与架构。 1. 前言 最近在做一个复杂表格设计数据格式设置,其中用到了多叉树原理,所以要用到递归来实现数据格式化。 2....递归概念 在程序中函数直接或间接调用自己 注意:使用递归函数一定要注意,处理不当就会进入死循环。递归函数只有在特定情况下使用 ,比如阶乘问题。 3. 例子 1....一个阶乘例子: function fact(num) { if (num <= 1) { return 1; } else {...使用arguments.callee arguments.callee 是一个指向正在执行函数指针,arguments.callee 返回正在被执行对现象。...} } var anotherFact = fact; fact = null; alert(antherFact(4)); //结果为24. 2.再看一个多叉树例子: 先看图 ?

    18.8K40

    JS编程: 递归

    毫无疑问,你已经在一些算法书籍和文章里,以及计算斐波纳契数列或者相似内容例子里,看到了一些可怕词汇。...所以,让我们从一个我觉得容易理解定义开始: 递归就是一个函数调用自身,直到达到某个特定状态。 让我们把它分为两部分,然后分别讨论。...一个调用自身函数意思是在函数体内,我们将调用同一个函数——初始化(inception),对吗?你第一次看见一个递归函数时候,可能会打破你对函数执行理解,但它绝对是正常。...这两种情况,我们都必须有一个明确停止条件,以防止递归一直执行。 应用递归 定义和解释并不能让我们实现什么,所以让我们从一个实际例子开始。我们将使用递归来说明怎样把一个分类列表排序成树状机构。...这是一个说明什么时候使用递归比普通迭代方法更好完美示例。我们会从创建一个函数开始,它包含两个参数——一个数组和一个我们正在查询父类。

    2.7K30
    领券