函数递归-------套娃套路深,要么你玩递归,要么递归玩你

简介: 函数递归-------套娃套路深,要么你玩递归,要么递归玩你

什么是递归?

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

递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接

调用自身的

一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,

递归策略

只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。

递归的主要思考方式在于:把大事化小

简单的来讲就是不断的套用自身的函数来达到能多次跟循环一样的效果,且代码简单

递归的两个必要条件

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

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

简单说就是需要判断,调用自身的时候传入的参数不能和原函数相同,

可能有些小可爱们还是不怎么理解,那我们来操作一下:

练习1;

接受一个整型值(无符号),按照顺序打印它的每一位

如输入1234,就打印出1234

思路:

当只有个位数直接打印即可,当超过1位数,我们用%10来得出余数,打印余数

代码如下:

void My_print(unsigned int inp)//正向打印
{
    if(inp/10)
    {
        My_print(inp/10);
    }
    printf("%d",inp%10);
}
void My_print_(unsigned int inp)//反向打印
{
    printf("%d",inp%10);
    if(inp/10)
        My_print_(inp/10);
}
int main()
{
    unsigned int inp=0;
    printf("请输入数字:>");
    scanf("%d",&inp);
    My_print(inp);
    return 0;
}

运行结果:

递归第一步是要先判断条件,写明判断条件就可以避免死循环

可能一题还不足以学会,我们接着来:

练习2:

编写函数不允许创建临时变量,求字符串的长度

思路:

在c语言中有strlen()计算字符串个数不计算'\0',我采用的是这个思路,

代码如下:

#include <stdio.h>
int num_strlen(char* arr)
{
    if(*arr!='\0')
    {
        return (1+num_strlen(arr+1));
    }
    return 0;
}
int main()
{
    char arr[]="bit";
    int num=num_strlen(arr);//传入的是数组的首元素地址
    printf("长度为%d",num);
    return 0;
}

每次递归时,传入的字符串数都是一个,当传入的字符为'\0'就停止递归下去

这两题可能还是一些小可爱不怎么理解,我们就在来一题

练习3

n的阶乘

!n=n*(n-1)*...*1=n*!(n-1)

思路:

代码如下:

#include <stdio.h>
int My_num(int n)
{
  if (n == 1)
    return 1;
  else
  {
    return n * My_num(n - 1);
  }
}
int main()
{
  int n = 0;
  printf("输入你想计算的阶乘:(数字)");
  scanf("%d", &n);
  int num = My_num(n);//返回计算结果
  printf("%d的阶乘结果为:%d", n, num);
  return 0;
}

结果:

看到这里有些小可爱们有眉目了

那我们就开始练习一下斐波那契数。

斐波那契数:

1,1,2,3,5.........

从第三个数开始该数等于两数之和,2==1+1,3=2+1,5=3+2

思路:

我们主要捉住重点就是前两数之和等于第三个数 当我们要求出第几位的斐波那契数,我们只需求出前两数即可

代码如下:

#include <stdio.h>
int My_num(int n)
{
  if (n <= 2)
    return 1;
  else
    return My_num(n - 1) + My_num(n - 2);//记住My_num()输入位置返回该位置的斐波那契数,因为该位置的斐波那契数等于前两数之和,只需前两数之和就行
}
int main()
{
  int n = 0;
  printf("你要求出第几位的斐波那契数:>");
  scanf("%d", &n);
  int num = My_num(n);//传入n返回斐波那契数数
  printf("第%d位的斐波那契数为%d", n, num);
  return 0;
}

结果:

当我们输入越来越大的值就会发现,运行时间越来越长,因为递归也是有缺陷的,会重复大量的工作,这是使用递归不可避免的

#include <stdio.h>
int My_num(int n)
{
  int a = 1;
  int b = 1;
  while (n>2)
  {
    int d = a + b;
    a = b;
    b = d;
    n--;
  }
  return b;
}
int main()
{
  int n = 0;
  printf("你要求出第几位的斐波那契数:>");
  scanf("%d", &n);
  int num = My_num(n);//传入n返回斐波那契数数
  printf("第%d位的斐波那契数为%d", n, num);
  return 0;
}

9208a6526f6b441192d8c3d7afb5773d.png

这是非递归的,运行速度就很快

所以建议:

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

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

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

总结

递归总的来说是一种方法,在解决问题中我们要用最简单有效的方法进行解决问题,递归很好用,但使用要看场景

相关文章
|
11月前
|
前端开发 JavaScript
如何使用 Promise 处理异步并发操作?
通过使用 `Promise.all()` 和 `Promise.race()` 方法,可以灵活地处理各种异步并发操作,根据不同的业务需求选择合适的方法来提高代码的性能和效率,同时也使异步代码的逻辑更加清晰和易于维护。
|
机器学习/深度学习 编解码 计算机视觉
Transformer又一城 | Swin-Unet:首个纯Transformer的医学图像分割模型解读
Transformer又一城 | Swin-Unet:首个纯Transformer的医学图像分割模型解读
2366 0
|
12月前
|
缓存 监控 测试技术
服务器压力测试
【10月更文挑战第11天】服务器压力测试
541 31
|
11月前
|
机器学习/深度学习 监控 自动驾驶
卷积神经网络有什么应用场景
【10月更文挑战第23天】卷积神经网络有什么应用场景
1371 2
|
12月前
|
数据采集 机器学习/深度学习 数据可视化
过采样与欠采样技术原理图解:基于二维数据的常见方法效果对比
本文介绍了处理不平衡数据集的过采样和欠采样技术,包括随机过采样、SMOTE、ADASYN、随机欠采样、Tomek Links、Near Miss 和 ENN 等方法。通过二维数据集的可视化示例,直观展示了各种方法的原理和效果差异。文章还讨论了混合采样方法(如SMOTETomek和SMOTEENN)以及应用这些方法的潜在风险,强调了在实际应用中审慎选择的重要性。
702 3
|
12月前
|
人工智能 语音技术 数据格式
三文带你轻松上手鸿蒙的AI语音01-实时语音识别
三文带你轻松上手鸿蒙的AI语音01-实时语音识别
319 0
三文带你轻松上手鸿蒙的AI语音01-实时语音识别
|
大数据 UED 开发者
实战演练:利用Python的Trie树优化搜索算法,性能飙升不是梦!
在数据密集型应用中,高效搜索算法至关重要。Trie树(前缀树/字典树)通过优化字符串处理和搜索效率成为理想选择。本文通过Python实战演示Trie树构建与应用,显著提升搜索性能。Trie树利用公共前缀减少查询时间,支持快速插入、删除和搜索。以下为简单示例代码,展示如何构建及使用Trie树进行搜索与前缀匹配,适用于自动补全、拼写检查等场景,助力提升应用性能与用户体验。
233 2
|
Linux
Linux 服务器下载百度网盘文件
本教程指导如何使用 `bypy` 库从百度网盘下载文件。首先通过 `pip install bypy` 安装库,接着运行 `bypy info` 获取登录链接并完成授权,最后将文件置于指定目录并通过 `bypy downdir /Ziya-13b-v1` 命令下载至本地。
1026 1
Linux 服务器下载百度网盘文件
|
存储 监控 Devops
|
运维 关系型数据库 OLAP
阿里云百炼 x AnalyticDB向量引擎, 搭积木式轻松开发专属大模型应用
对大模型应用跃跃欲试,但奈何技术栈复杂难以下手?已经进行试水,但缺乏调优手段无法保障召回率和问答准确度?自行搭建大模型、向量检索引擎、服务API等基础组件难以运维?大模型种类繁多,但缺乏行业模型和应用模板?阿里云百炼 x AnalyticDB向量引擎推出一站式企业专属大模型开发和应用平台,像搭积木一样轻松完成企业专属大模型应用的开发,提供应用API,可一键接入企业自己的业务应用对外提供服务。
1910 3