C语言,函数递归

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

7. 函数递归


7.1 什么是递归?(函数自己调用自己)


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


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


b814efd45f524082bd3aefc8df9cedca.png


各个程序员写各自的函数模块最后别人要用的时候直接在头文件里包含就行了


把文件设置为静态库这样函数就可以只给别人用,但是不会给别人看内容        各司其职


别人要用就只放 .h 和.lib 两个文件进他的工程就行


739b33bd766e48b9b862082f429339b7.png


实现功能


8004f14945fd4d6cb58061381a15aaae.png


递归:少量代码实现重复多次的过程(递推+回归)


c34943bbe7f94ab796575bd101a2f09c.png


每次调用函数时 都会在栈上开辟一个空间 (main函数也如此)保存临时变量


栈溢出——>死循环消耗过多栈空间


7.2 递归的两个必要条件(必须要有,但有不一定对)


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


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


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


​​​​#include <string.h>
#include <stdio.h>
int my_strlen(char* str)  //用指针接收
{
  if (*str != '\0')
  {
    return 1 + my_strlen(1 + str);    //str是数组的脚标
  }
  else
  {
    return 0;
  }
}
int main()
{
  //编写函数不允许创建临时变量,求字符串的长度(局部变量就叫临时变量)
  char arr[] = { "aadaed" };
  int len = my_strlen(arr); //字符串传参是传的首元素的地址
  printf("%d", len);
  return 0;
}


7.3 递归与迭代


7.3.1 练习:求n的阶乘。(不考虑溢出)


#include <stdio.h>
int fac(int n)
{
  if (n <= 1)
  {
    return 1;
  }
  else
  {
    return n * fac(n - 1);
  }
}
int main()
{
  int n = 0;
  scanf("%d", &n);
  int ret = fac(n);
  printf("%d", ret);
  return 0;
}


求第n个斐波那契数。(不考虑溢出)


2dec09123ad34de88bfddc8f56d2d3a1.png


以下是递归操作(不太适合,运算太大 速度慢)


int fib(int n)
{
  if (n <= 2)
    return 1;
  else
    return fib(n - 1) + fib(n - 2);
}
#include <stdio.h>  //求第n个斐波那契数。(不考虑溢出) 前两个数和等于第三个数
int main()
{
  int n = 0;
  scanf("%d", &n);
  int ret = fib(n);
  printf("%d", ret);
  return 0;
}


相关文章
|
9天前
|
程序员 C语言
C语言库函数 — 内存函数(含模拟实现内存函数)
C语言库函数 — 内存函数(含模拟实现内存函数)
16 0
|
19天前
|
编译器 C语言 C++
【C语言】memset()函数(内存块初始化函数)
【C语言】memset()函数(内存块初始化函数)
23 0
|
19天前
|
编译器 C语言 C++
【C语言】memcpy()函数(内存块拷贝函数)
【C语言】memcpy()函数(内存块拷贝函数)
38 0
|
9天前
|
程序员 C语言 开发者
C语言库函数 — 字符串函数(含模拟实现字符串函数)
C语言库函数 — 字符串函数(含模拟实现字符串函数)
35 0
|
15天前
|
存储 C语言
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现1
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现
|
15天前
|
机器学习/深度学习 C语言
【C语言】函数的系统化精讲(三)1
【C语言】函数的系统化精讲(三)
|
15天前
|
编译器 C语言
【C语言】函数的系统化精讲(一)2
【C语言】函数的系统化精讲(一)2
|
15天前
|
编译器 Serverless C语言
【C语言】函数的系统化精讲(一)1
【C语言】函数的系统化精讲(一)
|
15天前
|
存储 程序员 编译器
【C语言第二回】main、printf和库函数
【C语言第二回】main、printf和库函数
|
15天前
|
C语言 索引
【C语言】C语言⻘蛙跳台阶问题--递归问题
【C语言】C语言⻘蛙跳台阶问题--递归问题