news 2026/6/15 10:51:12

C 语言学习历程:(第七章)函数递归・在自我调用中探寻问题的精妙解法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C 语言学习历程:(第七章)函数递归・在自我调用中探寻问题的精妙解法

第七章:函数递归

文章目录

  • 第七章:函数递归
    • 1. 求 n 的阶乘
    • 2. 顺序打印一个整数的每一位
    • 3. 求 n 的 k 次方
    • 4. 递归与迭代
      • 4.1 求第 n 个斐波那契数
  • 总结

函数递归就是函数自己调用自己。其思想是将一个大型复杂问题层层转化为一个与原问题相似,但规模较小的子问题来求解;直到子问题不能再被拆分,递归就结束。递归中的递就是递推的意思,归就是回归的意思。

限制条件:

  • 递归存在限制条件,当满足这个限制条件的时候,递归便不再继续
  • 每次递归调用之后越来越接近这个限制条件

1. 求 n 的阶乘

一个正整数的阶乘是所有小于及等于该数的正整数的积,并且0的阶乘为1

#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>//阶乘//定义阶乘函数intfactorial(intn){if(n==0){return1;}returnfactorial(n-1)*n;}intmain(){//方法一:循环//int num = 1;//for (int i = 1; i <= 10; i++)//{// num *= i;//}//方法二 :递归,逻辑如下// 0!= 1// 1!= 1 = 0! * 1// 2!= 1 * 2 = 1! * 2// 3!= 1 * 2 * 3 = 2! * 3// 4!= 1 * 2 * 3 * 4 = 3! * 4// n! = (n-1)! * nintn=0;scanf("%d",&n);printf("%d",factorial(n));return0;}

2. 顺序打印一个整数的每一位

输入一个整数。按照顺序打印整数的每一位,例如输入:1234 输出: 1 2 3 4

#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>//顺序打印一个整数的每一位// 1 : 1// 12 : 1 2 = print_num(1) 2// 123 : 1 2 3 = print_num(12) 3// 1234 : 1 2 3 4 = print_num(123) 4// n : print_num(n / 10) n % 10voidprint_num(intnum){//方法一if(num/10==0){printf("%d",num);//个位数返回本身}else{print_num(num/10);//递归调用,去掉个位数printf(" %d",num%10);}//方法二//if (num > 9) //不是个位则进行递归//{// print_num(num / 10);//递归调用,去掉个位数//}//printf("%d ", num % 10);//if语句执行完还会打印数字,而不是else的关系}intmain(){intnum=0;scanf("%d",&num);print_num(num);//定义打印每一位数字的函数return0;}

3. 求 n 的 k 次方

输入一个整数 n 递归实现 n 的 k 次方

//递归实现n的k次方// 2^1 = 2// 2^2 = 2^1 *2// 2^3 = 2^2 *2// n^k = n^(k-1) * n//求n的k次方函数intexponent(intn,intk){if(k==1){returnn;//如果是1次方,返回本身}returnexponent(n,k-1)*n;}intmain(){intn=0;intk=0;scanf("%d%d",&n,&k);printf("%d",exponent(n,k));return0;}

4. 递归与迭代

在C语言中每一次函数调用,都需要为本次函数调用在内存的栈区,申请一块内存空间来保存函数调用期间的各种局部变量的值,这块空间被称为运行时堆栈,或者函数栈帧。

函数不返回,函数对应的栈帧空间就⼀直占⽤,所以如果函数调⽤中存在递归调⽤的话,每⼀次递归函数调⽤都会开辟属于⾃⼰的栈帧空间,直到函数递归不再继续,开始回归,才逐层释放栈帧空间。 所以如果采⽤函数递归的⽅式完成代码,递归层次太深,就会浪费太多的栈帧空间,也可能引起栈溢出的问题。

当不使用递归,通常就是迭代的方式(通常是循环)

4.1 求第 n 个斐波那契数

计算第n个斐波那契数,这个程序便不适合用递归求解

#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>//递归和迭代//求第n个斐波那契数//1 1 2 3 5 8 13 21 ...:前两个数相加等于后面的数字//第n个斐波那契数字:f(n) = f(n-2) + f(n-1)//递归实现斐波那契会有大量重复计算,效率低下intf_add(intnum){if(num==1||num==2){return1;}else{returnf_add(num-2)+f_add(num-1);}}intmain(){intnum=0;//定义变量接受第几个斐波那契数字scanf("%d",&num);f_add(num);//调用函数printf("%d\n",f_add(num));//打印结果return0;}

迭代实现:

#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>//迭代实现intmain(){intleft_1=1;//最左边第一个数intleft_2=1;//最左边第二个数intnum=0;//定义变量接受第几个斐波那契数字intn=1;//定义变量计算数字,初始值为1scanf("%d",&num);for(inti=0;i<num-2;i++){n=left_1+left_2;//计算当前数left_1=left_2;//更新左边第一个数left_2=n;//更新左边第二个数}printf("%d\n",n);//打印结果return0;}

第八章:操作符详解

总结

本文是在鹏哥 C 语言集训营学习过程中所记录的学习笔记,梳理了核心知识点,同时也记录了本人实操验证的代码案例,供后续学习复盘使用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 12:51:39

WebUI性能压测报告:DAMO-YOLO手机检测系统单节点QPS与延迟拐点分析

WebUI性能压测报告&#xff1a;DAMO-YOLO手机检测系统单节点QPS与延迟拐点分析 1. 引言&#xff1a;从“能用”到“好用”的性能挑战 当你部署好一个AI应用&#xff0c;比如我们之前介绍的手机检测系统&#xff0c;看到它能正常工作&#xff0c;是不是就万事大吉了&#xff1…

作者头像 李华
网站建设 2026/6/15 15:23:52

墨语灵犀部署教程(GPU版):A10/A100显卡下33语种并发翻译性能实测

墨语灵犀部署教程&#xff08;GPU版&#xff09;&#xff1a;A10/A100显卡下33语种并发翻译性能实测 1. 产品概述与核心价值 墨语灵犀是基于腾讯混元大模型开发的深度翻译工具&#xff0c;支持33种语言的高质量互译。与传统翻译工具不同&#xff0c;它不仅提供准确的翻译结果…

作者头像 李华
网站建设 2026/6/15 12:55:12

GTE-Pro语义引擎:新手避坑指南与技巧

GTE-Pro语义引擎&#xff1a;新手避坑指南与技巧 企业级语义检索不是“换个词搜索”&#xff0c;而是让系统真正听懂你没说出口的意思 很多刚接触GTE-Pro的朋友&#xff0c;第一反应是&#xff1a;“不就是个高级点的关键词搜索&#xff1f;” 结果一上手就卡在几个地方&#x…

作者头像 李华
网站建设 2026/6/15 12:49:18

FLUX.1-dev创意广告生成:基于PS插件开发的自动化设计流程

FLUX.1-dev创意广告生成&#xff1a;基于PS插件开发的自动化设计流程 做电商的朋友&#xff0c;最近是不是又被广告素材给难住了&#xff1f; 每天要出几十张不同尺寸的广告图&#xff0c;从社交媒体到电商平台&#xff0c;从手机端到PC端&#xff0c;每个渠道都要适配。设计…

作者头像 李华
网站建设 2026/6/15 12:53:02

Qwen3-TTS-Tokenizer-12Hz实时会议转录增强方案:语音降噪+智能修正

Qwen3-TTS-Tokenizer-12Hz实时会议转录增强方案&#xff1a;语音降噪智能修正 1. 为什么会议录音总是“听不清”&#xff1f; 上周参加一个三方线上会议&#xff0c;背景里咖啡机嗡嗡作响&#xff0c;同事家的狗突然狂吠&#xff0c;还有人说话时反复卡顿、重复词句。会后回听…

作者头像 李华