√C语言--递归与迭代
迭代
每一次对过程的重复
每一次迭代得到的结果作为下一次迭代的初始值
循环执行一次过程就是一次迭代
迭代需要用到循环
从前往后推理
递归
执行一个过程需要再次用到该过程
从后往前推理(先看到最后一步需要什么再一步一步往前推理)
递归中一定有迭代
程序调用自身的编程技巧
函数自己调用自己
优点:化繁为简
过程单一
简洁明了
缺点:运行效率过低
应用:问题按递归定义
解法递归
数据结构递归
能用迭代不用递归:递归容易造成溢出(栈爆了)
迭代和递归的次数越多,我们会发现迭代依然只需要一个简单的式子,而递归式子会越来越长
采用递归编写程序能使程序变得简洁和清晰。现代程序要求高可读性与低资源占用,递归完全违反了这两点,所以一般运用在不太占用资源且很普遍运用的地方
1.用递归写阶乘
//用函数定义实现
#include "stdio.h"
int f(int n){if(n==1||n==0)return 1;return n*(f(n-1));
}
int main(){int n;scanf("%d",&n);int r=f(n);printf("%d",r);return 0;
}
//用函数原型写(int f(int n);)
#include "stdio.h"
int f(int n);
int main(){int n;scanf("%d",&n);int k=f(n);printf("%d",k);return 0;
}
int f(int n){if(n==0||n==1)return 1;return n*(f(n-1));
}
2.斐波那契的阶乘实现
#include "stdio.h"
int f(int n){if(n==0)return 0;if(n==1)return 1;return f(n-1)+f(n-2);
}
int main(){int n;scanf("%d",&n);int r=f(n);printf("%d",r);return 0;
}
3.欧几里德辗转相除递归实现(做不出来先取一个例子数学方法手算一下)
#include "stdio.h"//x>y
int f(int x,int y){if(x%y==0)return y;else return f(y,x%y);
}
int main(){int x,y;scanf("%d%d",&x,&y);printf("%d",f(x,y));return 0;
}
4.递归写数组反序
#include "stdio.h"
int f(int a[],int n,int i,int j){if(i>j)return 0;int b;b=a[i];a[i]=a[j];a[j]=b;if(i<j) return f(a,n,i+1,j-1);
}
int main(){int n;scanf("%d",&n);int i;int a[n];for(i=0;i<n;i++)scanf("%d",&a[i]);f(a,n,0,n-1);for(i=0;i<n;i++){if(i<n-1)printf("%d ",a[i]);else printf("%d",a[i]);}return 0;
}
5.递归实现顺序检索
#include "stdio.h"
int f(int a[],int n,int i,int key){if(i<n) {if (a[i] == key)return i;else return f(a, n, i + 1, key);}//判断进行到n-1然后得到最终判断结果else return -1;}
int main(){int n;scanf("%d",&n);int i;int a[n];for(i=0;i<n;i++)scanf("%d",&a[i]);int key;scanf("%d",&key);int len=f(a,n,0,key);if(len==-1)printf("NULL");else printf("%d",len);return 0;
}
6.递归求数组最大元素
把最大元素换到a[1]然后和a[0]比较求出最大值
引入最大值函数
//思路:第一个元素和后n-1个元素中的最大元素作比较
#include "stdio.h"
int max(int a,int b){if(a>b)return a;else return b;
}
int f(int *a,int n){if(n>0){return max(*a,f(a+1,--n));}else return a[n-1];}
int main(){int n;scanf("%d",&n);int i;int a[n];for(i=0;i<n;i++)scanf("%d",&a[i]);printf("%d",f(a,n));
}
√C语言--递归与迭代相关推荐
- 迭代和递归的应用例子c语言,递归和迭代的应用以及区别
斐波那契数列: 1 1 2 3 5 8 13 21 34 55 - fb(n) : 1 n <= 2 fb(n-1) + fb(n-2) n > 2 int fb(n) { if(n &l ...
- C语言反转二叉树的递归和迭代解决方案(附完整源码)
C语言反转二叉树的递归和迭代解决方案 C语言反转二叉树的递归和迭代解决方案完整源码(定义,实现,main函数测试) C语言反转二叉树的递归和迭代解决方案完整源码(定义,实现,main函数测试) #in ...
- 【C语言函数】 - 库函数、自定义函数、函数参数、函数调用、嵌套调用链式访问、递归与迭代、缓冲区
目录 一.函数是什么 二.C语言中函数的分类 1.如何学会使用库函数 1.1.strcpy 1.2.memset 2.自定义函数 2.1.与库函数的区别 2.2.写一个函数可以找出两个整数的最大值 2 ...
- 【C语言】函数 ---- 函数的嵌套调用和链式访问、函数的声明和定义、变量的声明和定义、函数递归与迭代、递归时的栈溢出问题
函数 一.函数的嵌套调用和链式访问 1.嵌套调用 2.链式访问 2.1strlen()函数 2.2printf()函数 二.函数的声明和定义 1.函数声明和定义的介绍 2.函数声明和定义的使用 三.变 ...
- C语言详解系列——函数的认识(5)函数递归与迭代
文章目录 函数递归 函数的迭代 函数递归 什么是函数递归?函数自己调用自己的编程技巧我们称为递归,函数递归通常会把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需要少量 ...
- 计算机科学中的递归算法是把问题,从计算思维的视角辨析算法中的递归与迭代...
周世杰 算法思维是计算思维的一个方面,而在计算机科学中,基于递归和迭代的思维方式在算法和程序设计中广泛应用,是算法思维的重要构成部分.因此,信息技术学科教师在基础课教学中辨析递归与迭代算法,将其作为发 ...
- 【C递归和迭代】兔子繁殖问题、青蛙跳台阶问题和汉诺塔问题
⭐博客主页:️CS semi主页 ⭐欢迎关注:点赞收藏+留言 ⭐系列专栏:C语言初阶 ⭐代码仓库:C Advanced 家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们 ...
- 一起学DNS系列(十)图、例详解DNS递归和迭代查询原理及过程 (1)
上节中提到了一些有关递归查询的内容,但说的很少,也很笼统,本节将会从原理和实例两方面入手分析DNS的递归以及迭代查询. 在此之前,我们需要了解一些背景知识,以便于更好的理解今天的主题内容. 在互联网中 ...
- LeetCode 589. N-ary Tree Preorder Traversal-多子节点树前序遍历--递归,迭代--反向压栈--C++解法
LeetCode 589. N-ary Tree Preorder Traversal-多子节点树前序遍历–递归,迭代–反向压栈–C++解法 LeetCode题解专栏:LeetCode题解 LeetC ...
最新文章
- 人工智能、核聚变、碳捕捉……最有可能帮助拯救地球的10项技术
- VTK:Rendering之Mace
- [C#]async和await刨根问底
- 【图论】【最短路】【SPFA】香甜的黄油 Sweet Butter (luogu 1828)
- 电脑双系统--我想体验不一样的感觉
- 拓端tecdat|R语言基于ARMA-GARCH过程的VaR拟合和预测
- Stolz定理及其证明
- vscode :code runner运行include多个文件的cpp
- ssc335调试isp记录之色彩篇
- 微信支付详细教程实战
- python3 陌生的角落(1):基础语法
- 【牛牛的跳跳棋】dp解法
- 2021-06-22ctf学习wp模板
- nginx小知识: 通过location下 root,alias配置转发图片目录
- 一个例程学会使用——模糊逻辑工具箱
- 【不就是java设计模式吗】设计模式七大原则,用代码对比方式,化抽象为具体,实打实的教会你
- android hero动画,主动画 (Hero animations)
- 计算机技术复试面试英语自我介绍,计算机复试英语自我介绍
- 工程师解读:为何华为手机“干不过”小米(1)
- 检测QQ是否开通微信