√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

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

你可能感兴趣的:(C语言肝期末,c语言,递归法)