C语言--函数递归与迭代

news/2024/9/25 15:20:29/

递归在书写的时候,有两个必要条件:

1.递归存在限制条件,但凡满足这个限制条件时,递归便不再继续

2.每次递归调用之后越来越接近这个限制条件

递归的思想:

把大事化小事

递归其实就是函数自己调用自己

//int main()
//{
//    printf("hehe\n");
//    main();//再次调用main函数自己
//    return 0;
//}
输出结果就是程序进入死循环,一直打印hehe
总而言之,在函数中再次调用自己就是递归
如果递归无限的递归下去,就会出现这样的错误,栈溢出
//
每一次函数调用,都要为这次函数调用分配内存空间是内存的栈区上分配的,如果无限的递归调用函数,就会将栈区空间使用完,就会出现栈溢出的现象
//递归---求n的阶乘
//n的阶乘就是1~n的数字累计相乘
//n!=n*(n-1)!
//当n=0时,n的阶乘为1//Fact(int n)//传参穿过来一个n
//{
//    if (n == 0)
//        return 1;
//    else if (n > 0)
//        return n * Fact(n - 1);//就是n*(n-1)!
//}
//
//
//
//int main()
//{
//    int n = 0;
//    scanf_s("%d", &n);
//    int r = Fact(n);//n的阶乘
//    printf("%d\n",r);
//    return 0;
//}
//当输入数字是5的时候,n传上去的n是5,因为n>0,所以进行n * Fact(n - 1)、
//也就是n*(n-1)!    5*4!
//然后一次进行下去
//到最后,Fact(1)=1*Fact(0),因为Fact(0)=1,所以Fact(1)=1
//Fact(2)=2
//Fact(3)=6
//Fact(4)=24
//Fact(5)=120
//先递推再回归
//假设输入1234
// 1234%10=4
// 1234/10=123
// 123%10=3
// 123/10=12
// 12%10=2
// 12/10=1
// 1%10=1
// 1/10=0//void print(int n)//接收n值
//{
//    if (n > 9)
//        print(n / 10);
//    printf("%d ", n % 10);//打印余数
//}    
//
//int main()
//{
//    int n = 0;
//    scanf_s("%d", &n);
//    print(n);//传过去n值
//
//    return 0;
//}//假设n是123,大于9进去,先用print(123/10),把12的每一位打印出来
//上一步结束后,再打印123%10打印余数3//原理:
//print(1234)
//print(123)+ 4
//print(12)+ 3 4 
//print(1)+2 3 4   ***拆解到这一步然后返回依次打印
//代码的执行顺序是先print,再打印,
//你输入的数据进入print一直被拆分,知道拆分为1时就停止了,
// 然后再依次打印
//先是print(123)
//然后又进入print(123/10)也就是print(12)
//print(12)进去了print(12/10),也就是print(1),
//最后因为1<9,所以就先开始打印了1%10了,
//再返回打印12%10了,然后就是123%10
//最后的结果就是1 2 3//只有print调用完才能轮到printf去打印
//print(1234)分成两部分-- - print(123)和printf("%d", 4)
//print(123)分成两部分---print(12)和printf("%d",3)
//print(12)分成两部分---print(1)和printf("%d",2)

如果函数不返回,函数所对应的栈帧空间就会一直被占用

不使用递归,使用迭代---循环的方式来解决问题

循环一定是迭代,但迭代不一定是循环

//求n的阶乘---循环迭代
int Fact(int n)
{int i = 0;int ret = 1;for ( i = 1; i <= n; i++){ret *= i;//就是ret = ret * i}return ret;
}int main()
{int n = 0;scanf_s("%d", &n);int r = Fact(n);printf("%d", r);return 0;
}

使用迭代的方式去求解,不仅可以解决问题,效率还更高

斐波那契数列

1 1 2 3 5 8 13 21 34 55

当n≤2时,第n个斐波那契数都是1,当n>2时,第n个斐波那契数就可以通过前两个数相加计算

若果求第n个斐波那契数列,用Fib(n)来表示,

当n>2的时候,Fib(n)=Fib(n-1)+Fib(n-2)

//求第n个斐波那契数
//若果求第n个斐波那契数列,用Fib(n)来表示,
//
//当n > 2的时候,Fib(n) = Fib(n - 1) + Fib(n - 2)
int Fib(int n)
{if (n <= 2)return 1;elsereturn Fib(n - 1) + Fib(n - 2);}int main()
{int n = 0;scanf("%d", &n);int r=Fib(n);printf("%d\n", r);return 0;
}

当输入n为50,输出结果十分慢

//循环的方法求出第n个斐波那契数
//1 1 2 3 5 8 13 21 34 55
//求第3个数也就是求2,需要进行一次运算
//求第4个数的时候需要运算两次
//求第五个数的时候要运算3次。
//所以求第n个数的时候,要运算n-2次int Fib(int n)
{int a = 1;int b = 1;int c = 0;//n=1或者n=2的时候,可以不进入循环,n是3的时候大于2,就进去运算while (n > 2)//仅仅只有当n>2的时候我们才进行计算{c = a + b;a = b;b = c;n--;//当n是3的时候—1就是2,就不满足循环的条件}//当n是4的=时候,c=1+1=2,然后b就变成下一个运算中的a了,//第一个运算的c也变成第二个运算中的b了,然后第四个要求的数就是c了,//第一次运算的时候运行了一次n--.所以变成了3,在第二次运行的时候再次//运行就变成2了,就停止循环了return c;//当n=1时,不执行循环,直接返回c//当n=2时,不执行循环,直接返回c
}int main()
{int n = 0;scanf_s("%d", &n);int r = Fib(n);printf("%d", r);return 0;
}

http://www.ppmy.cn/news/1463132.html

相关文章

帝国cms自定义专题列表模板list.var中获取对应专题下的信息、信息数量及信息所属栏目名称

帝国cms自定义专题列表模板list.var中获取对应专题下的信息、信息数量及信息所属栏目名称 代码如下&#xff1a; $rr $empire->fetch1("SELECT GROUP_CONCAT(id) from phome_enewsztinfo where ztid$r[id]"); $ff $rr[0]; $ga explode(",", $ff); …

C++小游戏 合集

生化危机 #include<conio.h> #include<string.h> #include<stdio.h> #include<stdlib.h> #include<windows.h> #include<time.h> #include<direct.h> int n,round,gold0; bool f1,f2,f3,deadfalse,PC_64Bit; char str[4]; struct n…

MySQL---通用语法及分类

目录 一、SQL通用语法 二、 SQL分类 1.DDL 1.1 DDL数据库操作 1.2 DDL表操作---查询 1.3 DDL表操作---创建​编辑 1.4 DDL表操作---数据类型 1.5 DDL表操作---修改 1.6 DDL表操作---删除 1.7 DDL总结 2. 图形化界面工具DataGrip 2.1 创建 2.2 使用 3. DML 3.1 DML介绍 3.2 DM…

如何安装虚拟机Wmware,并且在虚拟机中使用centos系统

1. 前言 大家好&#xff0c;我是jiaoxingk 本篇文章主要讲解如何安装虚拟机&#xff0c;并且在虚拟机中安装centos系统&#xff0c;让windows电脑也能够使用Linux系统 2. 虚拟机的介绍 在安装Vmware之前&#xff0c;我们先做虚拟机的介绍 虚拟机&#xff1a;通过软件虚拟出来的…

分享一个用AI降本的思路,不懂代码也能上手

如何用AI解决实际的业务问题&#xff1f; 生财圈友我来利用ChatGPT做算法建模&#xff0c;每年为公司省下6万元。 今天他将分享通过ChatGPT进行数据分析的思路&#xff0c;从最开始定义问题到最终数据论证。 上手的实操过程门槛并不高&#xff0c;但可以实现把官方电商平台的…

【路径规划】基于飞蛾搜索算法实现复杂城市地形下无人机避障三维航迹规划

研究背景 复杂城市地形下无人机避障三维航迹规划是无人机技术领域的一个重要研究方向。无人机在城市环境中的广泛应用,如快递配送、城市监测和搜救等任务,对其航迹规划和避障能力提出了挑战。 研究背景包括以下方面: 无人机的快速发展:无人机技术在近年来得到了迅猛发展…

AbMole - 肿瘤发展与免疫器官的“舞蹈”:一场细胞层面的时间赛跑

在生物医学领域&#xff0c;肿瘤与免疫系统之间的相互作用一直是研究的热点话题。肿瘤细胞不是孤立存在的&#xff0c;它们与宿主的免疫系统进行着一场复杂的“舞蹈”。 最近&#xff0c;一项发表在《Molecular & Cellular Proteomics》杂志上的研究&#xff0c;为我们揭开…

【安装笔记-20240523-Windows-安装测试 FileZilla Client】

安装笔记-系列文章目录 安装笔记-20240523-Windows-安装测试 FileZilla Client 文章目录 安装笔记-系列文章目录安装笔记-20240523-Windows-安装测试 FileZilla Client 前言一、软件介绍名称&#xff1a;FileZilla Client主页官方介绍 二、安装步骤测试版本&#xff1a;3.67.0…