首页 > 其他分享 >函数的递归调用

函数的递归调用

时间:2022-10-04 14:44:56浏览次数:52  
标签:10 调用 return 函数 递归 int res test main

介绍:一个函数在函数体内又调用了本身,称之为递归调用

例子:

 

 

①当在函数main内调用test(4)时,执行判断if,由于4>2,执行test(n-1),此时n=4,则传值为test(3)

②继续执行判断if,由于3>2,执行test(n-1),此时n=3,则传值为test(2)

③继续执行判断if,由于2>2不成立,不执行test(n-1),此时n=2,输出n=2,栈③销毁

执行完③后,要返回上一个栈②,执行printf,输出n=3,栈②销毁

执行完②后,再返回上一个栈①,执行printf,输出n=4,栈①销毁

最后返回给main

打印为:

 

 

内存图如下:

 

 

 

 

 

 1 #include <stdio.h>
 2 
 3 void test(int n){
 4     if (n>2){
 5         test(n-1);
 6     }
 7     printf("\nn=%d", n);
 8 }
 9 
10 void main(){
11     test(4);
12 }

对于过程,记住先进后出


 

例2:

 

 

 同样是函数main内调用test(4)

 

 

 1 #include <stdio.h>
 2 
 3 void test(int n){
 4     if (n>2){
 5         test(n-1);
 6     }else{
 7     printf("\nn=%d", n);
 8     }
 9 }
10 
11 void main(){
12     test(4);
13 }

注意函数条件的设置,防止出现无限递归导致栈溢出

如果执行到return语句,会直接返回到函数调用的位置继续执行,而函数内return语句后面的不再执行

 

 


 

实例:

 1.要求输入一个n,打印出斐波那契数列的第n位数字

 1 #include <stdio.h>
 2 
 3 int test(int res){
 4     if(res == 1 | res == 2){
 5         return 1;
 6     }else{
 7         return test(res-1) + test(res-2);
 8     }
 9 }
10 //分析:如果n=1或者n=2,返回1,从n=3开始,返回前两个值相加
11 void main(){
12     int n = test(7);
13     printf("%d",n);
14 }

2.已知f(1)=3,f(n)=2*f(n-1)+1,求f(n)

 1 #include <stdio.h>
 2 
 3 int test(int res){
 4     if(res == 1){
 5         return 3;
 6     }else{
 7         return 2*test(res-1)+1;
 8     }
 9 }
10 
11 void main(){
12     int n = test(5);
13     printf("%d",n);
14 }

3.

 1 #include <stdio.h>
 2 
 3 //分析
 4 //day=10,有1个桃
 5 //day=9,有4个桃,(day10+1)*2=4
 6 //day=8,有10个桃,(day9+1)*2=10
 7 int m(int day){
 8     if(day == 10){
 9         return 1;
10     }else{
11         return (m(day+1)+1)*2;
12     }
13 }
14 
15 void main(){
16     int x = m(1);
17     printf("%d",x);
18 }

 

标签:10,调用,return,函数,递归,int,res,test,main
From: https://www.cnblogs.com/MorningMaple/p/16751514.html

相关文章

  • 网络字节序与主机字节序的转换函数实践
    字节序(1)即字节在电脑中存放时的序列与输入(输出)时的序列是先到的在前还是后到的在前。字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序(2)分类......
  • Java方法(方法的调用,重载)
    方法调用:调用方法:对象名.方法名(实参列表)Java支持两种调用方法的方式,根据方法是否返回值来选择当方法返回一个值的时候,方法调用通常被当做一个值,例如intlarger......
  • js 函数
    延迟执行functiondebounce(wait){vartimer=null;returnfunction(fn){if(timer!==null){clearTimeout(timer);}timer=setTimeo......
  • 【学习笔记】Mysql函数
    Mysql函数 常用函数数学运算SELECTABS(-100)  --绝对值SELECTCEILING(6.5) --向上取整SELECTFLOOR(6.5)  --向下取整SELECTRAND()   ......
  • javaheima15 递归
    JavaFile作用创建对象定位文件,可以删除、获取文件信息等。但不能读写文件内容。构建对象的方式Filefile=newFile(“文件/文件/绝对路径/相对路径”);File类创......
  • C++自学笔记 内联函数 Inline Function
      调用一个函数需要额外做一些什么:推入参数进堆栈推入返回地址进堆栈准备返回值在寄存器推出所有推入解决方法:内联函数InlineFunction  内联函数可以......
  • python partition函数_Python partition()函数的使用方法
    一、partition()函数的语法格式string_name.partition(separator)(1)string_name为要被分隔的字符串或字符串变量。(2)该函数有一个字符串类型的参数:separator,该参数用于指......
  • vue实现表格中添加标签,标签是多个需要循环-render函数 for循环返回
    vue实现表格中添加标签,标签是多个需要循环--实现:render函数for循环返回多个divfields_columns:[{type:'index',width:60,align:'center'},{title:......
  • 利用ldt_struct 与 modify_ldt 系统调用实现任意地址读写
    利用ldt_struct与modify_ldt系统调用实现任意地址读写ldt_struct与modify_ldt系统调用的介绍ldt_struct​​ldt​​​是​​局部段描述符表​​​,里面存放的是进程的段描......
  • Verilog——任务task的调用
    参考自以下链接处:http://t.csdn.cn/4ws4t下面直接看代码,代码中会有注意事项。`timescale1ns/10psmoduletraffic_lights;regclk;reg......