当前位置:首页 > 软件开发 > 正文

c语言中的递归函数?最简单的递归函数

c语言中的递归函数?最简单的递归函数

本篇文章给大家谈谈c语言中的递归函数,以及最简单的递归函数对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了...

本篇文章给大家谈谈c语言中的递归函数,以及最简单的递归函数对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

C语言,用递归函数求最大公约数

intgcd(inta,intb){ if(b==0)returna; elsereturngcd(b,a%b);}此乃递归实现,代码量最少,也很实用(前期)。其实直接用algorithm库里的__gcd(a,b)函数最快。这个函数用的也是欧几里得算法哦。超超实用的算法,四大定理也各种用。推荐去看欧几里得算法的证明,还有欧拉定理,费马小定理的证明,太妙了啊啊。

C语言中怎样判断一个函数是不是递归

C语言中的函数直接或间接调用自己的过程叫递归。

什么是递归函数

在数理逻辑和计算机科学中,递归函数或μ-递归函数是一类从自然数到自然数的函数。直觉上递归函数是"可计算的"。

C语言的while循环语句怎么理解它和递归有什么联系要注意什么吗

谢邀。

我的上一个回答介绍了C语言的“递归函数”,一行一行利用递归写出了求n!的C语言程序并分析了它的执行流程。

其实,每次递归调用都是在重复做同样一件事,都是计算nx(n-1)!。当然了,虽说是“同样一件事”,还是略有不同的(n的值每次都不同),所以称呼其为“迭代”更恰当一点。

计算机特别擅长处理重复迭代的工作,这也是我们人类使用计算机的原因之一,因为人类最不擅长,也不喜欢重复迭代的工作。有了计算机,程序员通过编程告诉计算机怎样做就可以了。

C语言中的while循环语句

虽然迭代用递归可以解决,但是C语言的循环语句更符合我们人类的使用习惯,用起来更习惯,我们先来看看C语言中的while语句。它的语法为:

while(条件表达式){语句;}

到达while语句时,程序会判断“条件表达式”的真假,若假则跳过while语句块。若真,则执行while语句块里的内容,到达语句块末尾时,程序会回到“条件表达式”处,再次判断真假。

现在知道了while循环语句的用法,我们来用它计算n的阶乘,C语言代码可以如下写:

上面的C语言代码和之前利用递归求阶乘的代码,从某种程度上来说,是等价的。我们仍然以factorial(3)为例,说说这段C语言代码的执行流程。

程序第一次到达while处,n=3,显然大于0,于是result=1x3,接着n=2;回到while处,n依然大于0,于是result=1x3x2;接着n=1,回到while处,n依然大于0,于是result=1x3x2x1,接着n=0;回到while处,0不大于0,于是跳过while语句,factorial函数返回result=6。

很多程序员习惯称呼n为循环变量,因为它控制着循环体是循环还是结束。

C语言的循环和递归

我在上一个回答中提到“递归和循环是常常是等价的”,这里就是一个例子。

但是要注意的是,递归和循环解决问题的思路不一样,用递归解决阶乘问题靠的是递推关系n!=n·(n-1)!,用循环解决这个问题则更像是把这个公式展开了:n!=n·(n-1)·(n-2)·…·3·2·1。

把公式展开了理解会更直观一些,所以有些时候循环程序比递归程序更容易理解。

在整个递归调用过程中,虽然分配和释放了很多变量,但是所有的变量都只在初始化时赋值,没有任何变量的值发生过改变,而上面的循环程序则是通过对n和result这两个变量多次赋值来达到同样目的的。

再来说说使用while的注意事项

既然“递归和循环常是等价的”,而递归函数如果写的不恰当就会造成无限递归,导致程序最后崩溃,那对应的,while循环语句如果写的不恰当,也会造成无限循环,程序员们常常称其为“死循环”。

造成while语句死循环的原因很简单,只要while的条件表达式不可能为假,程序跳不出while循环,就会导致C语言程序陷入“死循环”。

上面的C语言代码例子中,正整数n不断减1,最后n必定会等于0的,因此n>0有为假的时刻,所以不会导致死循环。

但是,如果不小心把n=n-1这条语句漏掉了,那程序永远都不会跳出while循环体了。

不过与无限递归不同,程序一般不会因为死循环崩溃,而是会“卡死”在死循环处。所以,在使用while循环语句之前,要确保while的条件表达式有机会为假,除非,你故意希望有一个死循环。

不过,有时候死循环并不是那么一目了然的,例如下面这个著名的3x+1问题:

循环体所做的事情是:如果n是偶数,就把n除以2,如果n是奇数,就把n乘3加1。一般的循环变量要么递增要么递减,可是这个例子中的n一会儿变大一会儿变小,最终会不会变成1呢?

可以找个数试试,例如一开始n等于7,每次循环后n的值依次是:7、22、11、34、17、52、26、13、40、20、10、5、16、8、4、2、1。最后n确实等于1了。

许多世界难题都是这样的:描述无比简单,连小学生都能看懂,但证明却无比困难。

读者可以再试几个数都是如此,但无论试多少个数也不能代替证明,目前世界上还无人能证明。

欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。

递归函数详细讲解

(1)边界条件:确定递归到何时终止,也称为递归出口。

(2)递归模式:大问题是如何分解为小问题的,也称为递归体。递归函数只有具备了这两个要素,才能在有限次计算后得出结果

在递归函数中,调用函数和被调用函数是同一个函数,需要注意的是递归函数的调用层次,如果把调用递归函数的主函数称为第0层,进入函数后,首次递归调用自身称为第1层调用;从第i层递归调用自身称为第i+1层。反之,退出第i+1层调用应该返回第i层。

一个递归函数的调用过程类似于多个函数的嵌套的调用,只不过调用函数和被调用函数是同一个函数。为了保证递归函数的正确执行,系统需设立一个工作栈。具体地说,递归调用的内部执行过程如下:

(1)运动开始时,首先为递归调用建立一个工作栈,其结构包括值参、局部变量和返回地址;

(2)每次执行递归调用之前,把递归函数的值参和局部变量的当前值以及调用后的返回地址压栈;

(3)每次递归调用结束后,将栈顶元

C语言中的递归函数,我觉得好难懂,这正常吗你们觉得难吗

谢邀。

我也这么觉得哈哈,我当初学习C语言时,觉得最难的就是“递归”了,比指针还难理解(C语言中的指针,很多人都认为难以理解)。

那什么是“递归”呢?

我有一天翻词典时,看到词典这么解释一个词:

惊人的:用来形容惊人的形容词。

这要么是恶搞,要么就是玩笑。然而在数学上确实有很多概念是用自己定义的,举个例子:n的阶乘等于n乘以n-1的阶乘,并且0的阶乘等于1。咋一看,似乎它并没有说清楚什么是阶乘,但是这样的描述,却足以让人知道怎样计算阶乘。例如计算4的阶乘:

4!=4x3!=4x3x2!=4x3x2x1!=4x3x2x1x0!=4x3x2x1x1=24

并不用细究阶乘到底是什么,只需要按照定义去计算即可,当然,这种定义方式必须要有一个“基础条件”,比如阶乘的“基础条件”就是0!=1。如果没有“基础条件”,阶乘只会无限往下推,没有尽头。

C语言中,什么是递归函数?

说了半天阶乘,就是为“递归”做铺垫的,如果一个概念需要用到自身,我们就称它的定义是递归的。那显然,递归函数一定是调用了自身的函数,这么说有点虚,来看看实例吧,下面用C语言计算n的阶乘。我们已经知道,递归最重要的就是“基础条件”了,我们先把阶乘的基础条件写好:

上面的代码实现了0的阶乘等于1,那如果n大于0呢?按照阶乘的定义,应该是nxfatorial(n-1),用代码实现就是:

这就用C语言实现了计算n的阶乘。factorial函数调用了自己,所以factorial是递归函数。事实上,不仅仅是直接调用自己,间接调用自己也属于递归函数。比如,A调用了函数B,函数B又调用了A,那A也是递归函数。

那,递归函数是怎么执行的呢?

为了方便解释,我们在factorial函数的else部分加几个局部变量:

这里以factorial(3)为例,用实线箭头表示调用,用虚线箭头表示返回,右边的框表示在调用和返回过程中各函数调用的局部变量的变化情况。

我们看图右边表示存储空间的框的变化过程,随着函数调用的层层深入,存储空间的一端逐渐增长,然后随着函数的层层退出,存储空间的这一端又逐渐缩短,这是一种具有特定性质的数据结构。

它的特性就是只能在某一端增长或缩短,并且每次访问参数和局部变量时只能访问这一末端的单元,而不能访问内部的单元,比如当factorial(2)的存储空间位于末端时,只能访问它的参数和局部变量,而不能访问factorial(3)和main()的参数和局部变量。

具有这种性质的数据结构称为堆栈或栈(Stack)。每个函数调用的参数和局部变量的存储空间(图里的一个小方框)称为一个栈帧(StackFrame)。系统为每个程序的运行预留了栈空间,函数调用时就在这个栈空间里分配栈帧,函数返回时就释放栈帧。

可以看出,写C语言递归函数最重要的就是一定要定义好“基础条件”,不然函数就会永远调用下去,知道系统资源耗尽程序崩溃为止。递归和循环是等价的,用循环能做的事用递归都能做,反之亦然,事实上有的编程语言(如某些LISP)只有递归而没有循环。

计算机硬件能做的所有事情就是数据存取、运算、测试和分支、循环(或递归),在计算机上运行的高级语言写的程序当然也不可能做到更多的事情,虽然高级语言有丰富的语法特性,但也只是为做这些事情提供一些方便。那么,为什么计算机是这样设计的?为什么想到计算机需要具有这几种功能,而不是更多或者更少?这些要归功于早期的计算机科学家,例如AlanTuring,他们在计算机还没有诞生的年代从数学理论上为计算机的设计指明了方向。

欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。

关于c语言中的递归函数和最简单的递归函数的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

最新文章