√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));
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值