迭代
每一次对过程的重复
每一次迭代得到的结果作为下一次迭代的初始值
循环执行一次过程就是一次迭代
迭代需要用到循环
从前往后推理
递归
执行一个过程需要再次用到该过程
从后往前推理(先看到最后一步需要什么再一步一步往前推理)
递归中一定有迭代
程序调用自身的编程技巧
函数自己调用自己
优点:化繁为简
过程单一
简洁明了
缺点:运行效率过低
应用:问题按递归定义
解法递归
数据结构递归
能用迭代不用递归:递归容易造成溢出(栈爆了)
迭代和递归的次数越多,我们会发现迭代依然只需要一个简单的式子,而递归式子会越来越长
采用递归编写程序能使程序变得简洁和清晰。现代程序要求高可读性与低资源占用,递归完全违反了这两点,所以一般运用在不太占用资源且很普遍运用的地方
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
5.递归实现顺序检索
#include "stdio.h"
int f(int a[],int n,int i,int key){
if(i
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