首页 > 其他分享 >【C语言】函数递归

【C语言】函数递归

时间:2024-11-16 19:15:43浏览次数:3  
标签:函数 迭代 C语言 问题 递归 使用 阶乘

1、递归的概念

        其实我们在前面的学习中已经使用过函数的递归了。那么什么是递归呢

        递归是一种解决问题的方法,就是函数自己调用自己,例如下面的函数。

       

         上面就是一个简单的函数递归,在main函数内调用自己。

2、递归的使用思路和限制条件

        1、使用思路

              在将一个大型问题一层一层转化为一个与原问题类似,但是规模较小的子问题来解,,                  直到这个问题没办法再拆分,递归就结束了,所以递归是把大事化小的一个过程。

         2、限制条件

              递归在使用的时候有下面两个限制条件:

              1、递归存在一个条件,当程序运行到满足这个条件后,,递归就结束,如果没有这个条                     件可能会陷入死递归

              2、每次递归后,程序会越来越接近限制条件。

3、递归实例

        例1:求n的阶乘

        题目描述:一个正整数的阶乘:是他和比他小的数的阶乘的乘积,而且0的阶乘为1。

                          我们可以发现n!=n*(n-1)!

                          例如:5!=5*4!=5*4*3!=5*4*3*2!=5*4*3*2*1!=5*4*3*2*1

        n的递归公式如下:

                         

        

      运行结果:

                      

    4、递归与迭代

             递归是一种很好的编程技巧,但是和很多技巧一样,也是有可能被误用的,就如上面的例               子一样,看到推导的公式,很容易就写成递归的形式

             C语言在每次函数调用,都要为本次函数调用在内存中的栈区,申请一块空间来保存函数               调用期间的各种局部变量的值,这块空间被称为运行时的堆栈,或者函数堆帧。

             函数不返回,函数对应的栈帧空间就一直占用,所以如果函数调用中存在递归调用的话,               每一次递归函数都会开辟属于自己的空间,直到函数递归不再继续,开始回归,才逐层释               放栈帧空间

             所以如果使用函数递归的方式解决问题,当问题规模大起来,要递归的次数多起来后,会               造成栈帧空间被大量浪费,还有可能会引起栈溢出的问题。

             如果不想使用递归的方式就得想想其他的方法,通常就会使用迭代的方法(一般都是使用               循环)

             例如:计算n的阶乘,

                       

                  上面定义的函数也可以完成题目的要求,而且效率是要比递归的方法要高的。我们可                      以去求一个大一点的数的阶乘,就可以发现递归和迭代的效率差距了。

                  事实上,我们看到许多问题是以递归的方式进行解释的,这只是因为它比非递归的形                      式更加清晰,代码更加容易写,但是这些问题使用迭代的方式运行的效率是会更高的

                  当一个问题非常复杂,难以使用迭代的方式实现的时候,此时递归的方式实现的简洁                      性可以补偿它所带来的运行时的开销

5、递归和迭代的实例

         例:求第n个斐波那契数列

               计算第n个斐波那契数,是不适合使⽤递归求解的,但是斐波那契 数的问题通过是使⽤                   递归的形式描述的。如下:

               

                看到这个公式我们会很容易想到使用递归方式。如下所示:

                

                当我们要求第50个的时候就需要很长时间了,如下图所示:

                

                可以看到程序要一直递归下去。效率会非常低,所以我们使用非递归的方法实现

               

                   

标签:函数,迭代,C语言,问题,递归,使用,阶乘
From: https://blog.csdn.net/2302_81083101/article/details/143744103

相关文章

  • 手把手教你用C语言写一个简单的quine(输出自身的程序)
    第一步,写个简单的框架#include<stdio.h>intmain(){ printf("#include<stdio.h>\nintmain(){\n\tprintf();\n\treturn0;\n}"); return0;}printf的东西先留空。这时你会发现printf里面的东西需要是这句东西本身,如果把这句话复制进去,你会发现最内层还存在一个空的括号,反......
  • c语言的分支结构
    C语言程序有3种基本结构:顺序结构、选择结构和循环结构1)顺序结构:所谓顺序结构,就是从上到下的所有语句都会依次执行2)选择结构:选择结构中存在一条(或多条)分支语句,当满足分支的条件时语句才会执行,否则不会执行3)循环结构:循环结构即是在某些条件的控制下重复执行一段代码语句,当......
  • c语言快速排序
    快速排序(Quicksort)是一种高效的排序算法,采用分治法(DivideandConquer)策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。快速排序的步骤:选择基准(Pivot):从数列中挑出一个元素,称为"基准"(pivot)。分区(Partitioning):重新排序数列,所有元素比基准值小的摆放......
  • gym游戏_单腿翻滚的reward简略函数的设置
    相关:https://openai.com/index/learning-from-human-preferences/google的researcher人为设定了一个rewardfunction,具体形式如下:defreward_fn(a,ob):backroll=-ob[7]height=ob[0]vel_act=a[0]*ob[8]+a[1]*ob[9]+a[2]*ob[10]backslide......
  • 各种内置函数技巧总结
    各种内置函数技巧总结数学库等abs(x)取绝对值,自动类型,注意没有abs(__int128)。(int)(x*100+0.5)/100.0四舍五入保留两位小数。printf("%.2lf",x)以double类型输出\(x\)保留两位小数,有时不一定四舍五入。longdouble的格式符是%Lf。以下函数在函数名末尾加上l就......
  • 将数值转换为字符串的函数
    在C++中,itoa和sprintf是用于将数值转换为字符串的经典函数。然而,它们有一定的局限性或者安全性问题,现代C++更倾向于使用标准库的解决方案,如std::to_string和std::stringstream,来代替这些函数。可以看看这篇博客streamstring类介绍1.itoa的替代itoa是一种将整数转......
  • JPQL与数据库函数的完美结合实例
    在Java持久化操作中,JPQL(JavaPersistenceQueryLanguage)是一种强大的查询语言,它允许开发者以面向对象的方式执行数据库查询。JPQL不仅支持对实体属性的查询,还支持调用内置和用户自定义的数据库函数。本文将通过一个具体实例,展示如何在JPQL中调用H2数据库的内置函数,以实现更......
  • 动画函数封装
    5.2.1、简单动画实现核心原理:通过定时器setInterval()不断移动盒子位置实现步骤:获得盒子当前位置、让盒子在当前位置上加上1个移动距离、利用定时器不断重复这个操作、加一个结束定时器的条件需要给元素加定位,利用left值变化改变元素的位置<!--需求:小盒子从左向右移......
  • stoi函数介绍
    stoi是C++标准库中的一个函数,定义在头文件<string>中,它用于将字符串转换为整数类型。函数原型intstoi(conststd::string&str,size_t*idx=0,intbase=10);str(必选):要转换的字符串,必须以数字开头(可以包含正负号)。插一句题外话如果不以数字开头,会这样:idx(可......
  • 【落羽的落羽 C语言篇】指针·之其二
    文章目录一、const使用指南1.const修饰变量2.const修饰指针变量二、野指针1.野指针的概念2.野指针的成因3.如何规避野指针三、assert(断言)使用指南四、传值调用和传址调用1.传值调用2.传址调用一、const使用指南1.const修饰变量众所周知,变量是可以修......