【学习笔记之我要C】函数递归

简介: 【学习笔记之我要C】函数递归

一、函数递


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

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

void print(unsigned int n) {
  if (n > 9) {
    print(n / 10);
  }
  printf("%d ", n % 10);
}
int main() {
  unsigned int num = 0;
  scanf("%u", &num);
  //递归 - 函数自己调用自己
  print(num);//print函数可以打印参数部分数字的每一位
  return 0;
}


24189703e3364e2cbc70ab488bae54f8.png

二、递归的必要条件

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

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

  这是必要条件,但是不充分!如果递归太深,会导致栈溢出,程序就不能正常运行。

三、练习

//编写函数,不创建临时变量,求字符串的长度
int my_strlen(char* str) {
  if (*str != '\0')
    return 1 + my_strlen(str + 1);
  else
    return 0;
}
int main() {
  char arr[] = "dream";
  printf("%d\n", strlen(arr));
  //模拟实现一个strlen函数
  printf("%d\n", my_strlen(arr));
  return 0;
}
//求n的阶乘
int Fac(int x) {
  if (x <= 1)
    return 1;
  else
    return x * Fac(x - 1);
}
int main() {
  int n = 0;
  printf("请输入一个数:");
  scanf("%d", &n);
  int ret = Fac(n);
  printf("这个数的阶乘是:%d\n", ret);
  return 0;
}
//求第n个斐波那契数的值
int Fib(int x) {
  if (x <= 2)
    return 1;
  else
    return Fib(x - 1) + Fib(x - 2);
}
int main() {
  int n = 0;
  printf("请输入一个数:");
  scanf("%d", &n);
  int ret = Fib(n);
  printf("第%d个斐波那契数的值是:%d", n, ret);
  return 0;
}
目录
相关文章
|
存储 NoSQL 关系型数据库
Redis数据库 | 基本数据类型、特殊数据类型
Redis数据库 | 基本数据类型、特殊数据类型
172 0
|
数据可视化 前端开发 Java
为什么说Windows这么强大呢?— 原来是因为图形化界面
为什么说Windows这么强大呢?— 原来是因为图形化界面
358 0
|
网络安全
捕获网络流量(一)
捕获网络流量(一)
|
JavaScript 前端开发 测试技术
探究 JavaScript 类型检查的利器:typeof 和 instanceof
探究 JavaScript 类型检查的利器:typeof 和 instanceof
|
存储 Unix Linux
<C语言错误处理> <signal.h>头文件及signal函数等内置函数
<C语言错误处理> <signal.h>头文件及signal函数等内置函数
|
算法 数据库 Docker
大模型必备向量数据库-Milvus的安装过程
大模型必备向量数据库-Milvus的安装过程
2190 0
|
Windows
FL studio21中文版水果音乐软件功能特色
FL Studio是目前流行广泛使用人数最多音乐编曲制作软件,这款软件相信广大网友并不陌生,今天带来的是FL中文版本,所有的功能都能在线编辑,用户直接就能操作,同时因为是21水果是最新版,所以增加了新的功能,拥有八十多种乐器和效果插件,还包括效果链、音频发送、侧链控制、高级自动化、插件延迟补偿等,帮助用户制作出更加流行的音乐作品。
350 0
|
Java 调度
Java多线程(2)--Thread类继承和Runnable接口创建线程
Java多线程(2)--Thread类继承和Runnable接口创建线程
Java多线程(2)--Thread类继承和Runnable接口创建线程
|
架构师 开发者
域名注册实操|学习笔记
快速学习域名注册实操。
163 0
域名注册实操|学习笔记
|
监控 Java
21、断路器集群监控Turbine
本文将结合之前学习的注册中心Eureka、服务提供者Provider、断路器Hystrix和仪表盘Dashboard,学习断路器集群监控Turbine。
181 0
21、断路器集群监控Turbine