递归函数原理

递归函数实现原理

函数定义:就是函数体的实现。函数体就是一个代码块,它在函数被调用时执行。

函数声明:向编译器提供该函数的相关的信息,包括:参数的数量,每个参数的类型以及返回值的类型。用于函数被正确的调用。

【注意】:当一个函数被调用时,编译器如果无法看到它的任何声明,那么它就假定函数返回一个整型值。对于那些返回值不是整型的函数,在调用之前对它们进行声明是非常重要的,这可以避免由于不可预测的类型转换而导致的错误。对于那些没有原型的函数,传递给函数的实参将进行缺省参数提升:char和short类型的实参被转换为int类型,float转换为double类型。

运行结果:25

2.      向编译器提供函数特定信息的方法有两种。第一种:将函数的定义放在源文件的前面。

第二种:提供函数原型。

3.      整型常量转换字符常量方法如下:

0 + ‘0’ = ‘0’

1 + ‘0’ = ‘1’

4.      递归本质的讲解:

例如:给出一个值4267, 我们需要依次产生字符‘4’, ‘2’, ‘6’, ‘7’.

分析递归的工作原理:

第一步:当函数刚开始执行时,堆栈的内容如下:

第二步:执行除法运算之后,堆栈的内容如下:

第三步:接着,if语句判断出p的值非零,所以对该函数执行递归调用。当这个函数第二次被调用之初,堆栈内容如下:

第四步:堆栈上创建了新的变量,隐藏了前面的那批变量,除非当前这次递归调用返回,否则它们是不能被访问的,再次执行除法运算之后,堆栈的内容如下:

第五步:m的值现在为42,仍然非零,所以继续执行递归调用,并再创建一批变量。在执行完这次调用的除法运算之后,堆栈的内容如下:

第六步:此时,m的值还是非零,继续执行递归调用。在执行除法运算之后,堆栈内容如下:

第七步:现在m的值为零,递归函数不再调用自身,而开始打印输出。然后函数返回,并开始销毁堆栈上的变量值。每次调用putchar得到的变量m的最后一个数字,并对m进行模10取余运算,将它与字符常量’0’相加,并输出结果。

输出结果:4

第八步:接着函数返回,它的变量从堆栈中销毁。接着,递归函数的前一次调用重新继续执行,它使用的是自己变量,它们位于堆栈的顶部。因为它的m值是42,所以调用putchar后打印出来的数字是2.

输出结果:42

输出结果:426

输出结果:4267

递归函数在栈内的执行过程:

时间: 2024-10-11 09:03:59

递归函数原理的相关文章

公用表表达式

大家好,今天我们来学习一下公用表表达式.在项目中需要编写SQL语句,因为自己本身对SQL Server知之甚少,一些较复杂的SQL语句,我是写不出来的.于是,请教我的一位好朋友,数据库MVP.他给我发来了一段SQL语句,相当好用.在佩服他的SQL语句时,我发现了公用表表达式这个概念,于是就Bing了一篇文章,用心研究了一番.在这里与大家分享一下我的学习心得. 公用表表达式(Common Table Expressions) CTE(公用表表达式)的作用类似于我们的临时表,就是可以作为SELECT

C语言结构体作业

一.PTA实验作业 题目1:6-3 结构体数组中查找指定编号人员 1. 本题PTA提交列表 2. 设计思路 定义一个结构体指针*p for i=0 to i=7 如果std+i的编号与输入的编号一样 将std+i的地址传给p end for 返回p 3.代码截图 4.本题调试过程碰到问题及PTA提交列表情况说明. 无错误 题目2:7-2 时间换算 1. 本题PTA提交列表 2. 设计思路 定义结构体数组Time,其内容包括时,分,秒 定义一个字符ch,增加的秒数n,结构体变量time 输入tim

php利用递归函数实现无限级分类

相信很多学php的很多小伙伴都会尝试做一个网上商城作为提升自己技术的一种途径.各种对商品分类,商品名之类的操作应该是得心应手,那么就可以尝试下无限级分类列表的制作了. 什么是无限级分类? 无限级分类是一种分类技巧,例如部门组织,文章分类,学科分类等常用到无限级分类,将其简单理解成分类就好了.其实我们仔细想一下,生活中的分类简直太多了,衣服可以分为男装和女装,也可以分为上衣和裤子,也可以根据年龄段分类.分类无处不在,分类显得“无限”.我这里就不说无限分类的必要性了. 无限级分类原理简介 无限分类看

进一步讨论递归函数——递归与栈

递归函数,在函数的执行函数中,需多次进行自我调用.那么,递归函数是如何执行的?先看任意两个函数之间进行调用的情形.用函数和被调用函数[若在函数A中调用了函数B,则称函数A为调用函数,称函数B为被调用函数.]之间的链接及信息交换需通过栈来进行.在上一篇递归函数的讲解中主要对递归的定义和一些应用进行了介绍,最近学习了一点数据结构的知识,看到了递归函数的工作原理其实使用栈来实现的我才恍然大悟.知识学多了,真的可以连接到一起的. 通常,当在一个函数的运行期间调用另一个函数时,在运行被调用函数之前,系统需

OpenGL学习进程(13)第十课:基本图形的底层实现及算法原理

    本节介绍OpenGL中绘制直线.圆.椭圆,多边形的算法原理.     (1)绘制任意方向(任意斜率)的直线: 1)中点画线法: 中点画线法的算法原理不做介绍,但这里用到最基本的画0<=k<=1的中点画线法实现任意斜率k直线的绘制. 1)当A点x坐标值大于B点坐标值时,即A点在B点的右侧时,交换A.B点的坐标.保证A点在B的左侧. 2)考虑特殊情况,当直线AB的斜率不存在时,做近似处理,设置斜率为-(y0-y1)*100,即近似无穷大. 3)当斜率m满足0<=m<=1时,按书

递归原理

为了理解递归的工作原理,你需要追踪递归调用的执行过程,所以让我们来进行这项工作.追踪一个递归函数的执行过程的关键是理解函数中所声明的变量是如何存储的.当函数被调用时,它的变量的空间是创建于运行时堆栈上的.以前调用的函数的变量扔保留在堆栈上,但他们被新函数的变量所掩盖,因此是不能被访问的. 当递归函数调用自身时,情况于是如此.每进行一次新的调用,都将创建一批变量,他们将掩盖递归函数前一次调用所创建的变量.当我追踪一个递归函数的执行过程时,必须把分数不同次调用的变量区分开来,以避免混淆. 程序中的函

oralce递归函数

语法: select * from table where 条件1 [语句一] start with 条件2                                                 [语句二] connect by prior 当前表字段=级联表字段         [语句三] 说明: connect by 和 start with 的位置关系不影响结果,where条件子句可以不需要,那么他们三者的作用范围 语句一    :是根据start with 和connect b

JavaScript递归原理

JavaScript递归是除了闭包以外,函数的又一特色呢.很多开发新手都很难理解递归的原理,我在此总结出自己对递归的理解. 所谓递归,可以这样理解,就是一个函数在自身的局部环境里通过自身函数名又调用,如此反复,直到条件不满足,返回最终结果的一种情形.最简单的一个示例代码如下: function fn(a){ return a <= 1 ? a = 1 : a * fn(a - 1); } 这也是一个最经典的递归阶乘函数了,虽然这行代码表面上看起来没什么问题,但在执行如下代码,则会出现错误. va

递归函数,匿名函数,内置函数

# 1,什么是递归函数,递归函数是在调用函数本身,直接或者间接调用# 递归函数有递推和回溯两个阶段# 递推:一层层地调用自身,进入下一层问题规模必须减少# 回溯:有一个明确的结束条件,但条件满足的时候一层层回溯def num(x): if x==0: return num(x-1) # 二分法:nums=[1,2,3,4,5,6,7,8,9]def seach(seach_nums,nums): if len(nums)==0: print('have no find') return prin