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;
}


相关文章
|
5天前
|
C语言
C语言—内存函数的实现和模拟实现(内存函数的丝绸之路)
C语言—内存函数的实现和模拟实现(内存函数的丝绸之路)
18 0
|
5天前
|
C语言
C语言—字符函数与字符串函数(字符问题变简单的关键之技)
C语言—字符函数与字符串函数(字符问题变简单的关键之技)
6 0
|
1天前
|
C语言 C++
C语言进阶⑭(内存函数_以字节操作)momcpy+mommove+memcmp+memset
C语言进阶⑭(内存函数_以字节操作)momcpy+mommove+memcmp+memset
5 0
|
1天前
|
算法 程序员 编译器
C语言初阶③(函数)知识点+编程作业(递归模拟strlen,pow)
C语言初阶③(函数)知识点+编程作业(递归模拟strlen,pow)
7 0
|
5天前
|
C语言
C语言——函数递归
C语言——函数递归
7 0
|
5天前
|
C语言
C语言—函数(大化小方式的心脏)
C语言—函数(大化小方式的心脏)
4 0
|
6天前
|
C语言
每天一道C语言编程(递归:斐波那契数,母牛的故事)
每天一道C语言编程(递归:斐波那契数,母牛的故事)
5 0
|
6天前
|
存储 编译器 C语言
C语言:字符函数 & 字符串函数 & 内存函数
C语言:字符函数 & 字符串函数 & 内存函数
16 2
|
6天前
|
C语言
【C语言/数据结构】排序(快速排序及多种优化|递归及非递归版本)
【C语言/数据结构】排序(快速排序及多种优化|递归及非递归版本)
11 0
|
6天前
|
缓存 安全 编译器
【C 言专栏】C 语言函数的高效编程技巧
【5月更文挑战第1天】本文探讨了C语言中函数的高效编程技巧,包括函数的定义与作用(如代码复用和提高可读性)、设计原则(单一职责和接口简洁)、参数传递方式(值传递、指针传递和引用传递)、返回值管理、调用约定、嵌套与递归调用,以及函数优化技巧和常见错误避免。掌握这些技巧能提升C语言代码的质量和效率。
【C 言专栏】C 语言函数的高效编程技巧