递归和迭代详解

简介: 递归和迭代详解

一.递归

什么是递归:

程序调用自身的编程技巧称为递归( recursion)。

递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接 调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问 题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。


int main()
{
     printf("hello!!!");
     main();
     return 0;
}

这就是一个简单的递归,但是如果像这样没有条件限制的情况下,在程序运行后会跳出下面的这种情况:

我们称这种情况叫做栈溢出,意思就是,系统给我们这个Main函数分配的空间被沾满,用图来表示就是:

栈溢出就是6块分配的内存全部使用完,造成溢出,为了防止出现这种情况的出现,我们对递归做出了限制,使用递归必须要有这两个必要条件:

1.存在限制条件,当满足这个限制条件的时候,递归便不再继续。

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


下面举一个例子:

一.使用递归实现数字n的阶层:

int jc(int X)
{
    if(X>0)
    {
        return X*jc(X-1);
    }    
 
}
int main()
{
    int num=0;
    scanf("%d",&num);
    int c=jc(num);
    printf("%d阶层数为:%d",num,c);    
  return 0;
}

我用图的形式给大家讲解一下这个题递归的原理

通过图解清晰看出递归的工作原理,同时也符合上面所需的两个必要条件


二.迭代

什么是迭代:

迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。重复执行一系列运算步骤,从前面的量依次求出后面的量的过程。


int main(0
{
    int s=1;
    while(s!=5)
    {
        printf("%d",s);
        s++;
    }
    return 0;
}

如果让我们一个一个去比,工作巨大且效率也不高,使用了迭代可以去除重复多余的部分,所以迭代成为很好的选择


下面举一个例子:

一.做一个可以计算字符个数的函数

int my_strlen(char* str)
{
    int con=0;
    while(*str!='\0')
    {
        str++;
        con++;
    }
 return con;
}
int main()
{
  int d=0;
  char str[]="abcde";
  d=my_strlen(&str);
  printf("字符个数%d",d);
  return 0;
}

一个简易版的strlen函数就完成了,这里就是使用了迭代,不停的去和\0进行比较,没比较一次都会自增1,这样我们省下了很大的工作量。


三.递归和迭代

上面分别讲解了递归和迭代,两者之间有相同点也有不同的地方

1. 许多问题是以递归的形式进行解释的,这只是因为它比非递归的形式更为清晰。

2. 但是这些问题的迭代实现往往比递归实现效率更高,虽然代码的可读性稍微差些。

3. 当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所带来的运行时开销。

相关文章
|
存储 运维 安全
|
算法
递归算法和迭代算法有什么不同
递归算法和迭代算法有什么不同
983 1
|
存储 关系型数据库 MySQL
利用Xtrabackup进行mysql增量备份和全量备份
利用Xtrabackup进行mysql增量备份和全量备份
1555 0
|
存储 人工智能 缓存
官宣开源|阿里云与清华大学共建AI大模型推理项目Mooncake
2024年6月,国内优质大模型应用月之暗面Kimi与清华大学MADSys实验室(Machine Learning, AI, Big Data Systems Lab)联合发布了以 KVCache 为中心的大模型推理架构 Mooncake。
|
架构师 安全 程序员
软考资料-分享
本文提供了计算机软考资源分享,包括高级、中级和初级三个层次的专业课程。高级课程如系统架构师、网络规划设计师等,中级课程如网络工程师、数据库系统工程师等,初级课程如网络管理员、程序员等,覆盖了多种专业方向,适合不同水平的学习者。
8458 1
|
存储 编译器 C语言
C语言:数组名作为类型、作为地址、对数组名取地址的区别
在C语言中,数组名可以作为类型、地址和取地址使用。数组名本身代表数组的首地址,作为地址时可以直接使用;作为类型时,用于声明指针或函数参数;取地址时,使用取地址符 (&),得到的是整个数组的地址,类型为指向该类型的指针。
1354 4
|
监控 Linux 网络安全
Centos7下多种方式配置 Apache虚拟主机
Centos7下多种方式配置 Apache虚拟主机
1502 1
Centos7下多种方式配置 Apache虚拟主机
|
安全 前端开发 应用服务中间件
ssl卸载原理
ssl卸载原理
1211 0
yolov5项目如何安装pycocotools和opencv-python?
本文提供了解决yolov5项目中安装pycocotools和opencv-python包失败的两种方法:手动安装或使用国内镜像源进行安装。
yolov5项目如何安装pycocotools和opencv-python?
|
测试技术 编译器
栈溢出处理
栈溢出处理
654 2