浅谈递归函数—C语言

目录:

  • 浅谈递归函数—C语言
    • 递归函数的概念
    • 例题
    • 总结

递归函数的概念

  1. 递归函数的定义:函数在其函数体内直接或间接调用它本身,则称该函数为递归函数。
  2. 递归的两个必要条件:(1)存在限制条件,当满足这个限制条件的时候,递归便不再继续;(2)每次递归调用之后越来越接近这个限制条件。
  3. 递归的主要思想:通过少量程序来描述解决问题过程所需的多次重复计算,即所谓的大事化小。
  4. 拓展:每一次调用递归函数时,计算机都会为该函数重新分配新的内存空间,并且将原递归函数暂停(可以理解为开副本),然后现场保存一下,即利用堆栈保存暂定位置,以及参数值保存。

例题

编程离不开示例,我们现在以例题帮我们加深对递归函数理解。
1.计算n!(1×2×3×·······×n)
先来看看整个的代码:

#include<stdio.h>
int Fac(int n)
{if (n <= 1)//0!=1  1!=1return 1;elsereturn n*Fac(n - 1);//递归函数,自己调用自己
}
int main()
{int n = 0;scanf("%d", &n);//存储用户输入的值int ret = Fac(n);printf("%d\n", ret);return 0;
}

我们以n=3为例子,来看看下面这张图的思路

要用递归我要先找到需要重复计算的部分:n*Fac(n - 1),以及递归函数的出口n <= 1,有了这两个我们才可以设计程序。

拓展:每次调用递归函数,都会利用堆栈保存现场,以刚刚计算阶乘为例,其在堆栈保存如图所示,先入的放在最底下,这样返回的时候,程序就可以清晰的直到自己要去到什么位置,从什么位置继续执行程序,后面进入先出来,当然这是比较抽象理解,在计算机内部都是以二进制形式表示。

2. 计算斐波那契数
的确斐波那契数考虑到效率,较优解并不是以递归的形式,而是以迭代循环的形式计算,这里举例斐波那契数列只是为了了解递归。
首先理解什么是斐波那契数:

1 1 2 3 5 8 13 21 34.........

从数学定义角度来看:
Fib(0)=1
F(1)=1
F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)
可以直观看出斐波那契数列在n>=2后其值为前两项之和
同样先看看代码:

int Fib(int n)
{if (n <= 2)return 1;elsereturn Fib(n - 1) + Fib(n - 2);
}
int main()
{int n = 0;scanf("%d", &n);int ret = Fib(n);printf("%d\n", ret);return 0;
}

我们以n=3为例子,来看看下面这张图的思路:

要用递归我要先找到需要重复计算的部分:Fib(n - 1) + Fib(n - 2),以及递归函数的出口n <= 2,有了这两个我们才可以设计程序。

3.汉诺塔问题
汉诺塔游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置n个金盘,游戏目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。

为了方便理解,用动态图来表示:(图片来源知乎)

用递归的思想,我们要找到递归设计的两个重要部分:(1)重复部分,即自相似部分;(2)递归的出口。
(1)重复部分:不难发现,圆盘移动分三步:
第一步 把n-1个圆盘从A杆经C杆移动到B杆;

第二步 将A杆上第n个圆盘移动到C杆;

第三步 然后再将n-1个圆盘从B杆经A杆移动到C杆。

同理移动n-1个圆盘与移动n个圆盘是相识的,但是又有细微的不同,就是圆盘的插入杆变化了。

所以我就先制定函数的参数:
int hanoi(int n, char A, char B, char C)

//hanoi 汉诺塔
//n表示圆盘数
//上式子可以表示为将n个圆盘从A经B移动到C

提取重复部分:
hanoi(n - 1, A, C, B)
//将n-1个圆盘从A经C移动到B

move(A, C);
//将第n个圆盘从A移动到C

hanoi(n - 1, B, A, C)
//将n-1个圆盘从B经A移动到C

(2)递归函数的出口:
但N=1 时 ,只剩下一个圆盘直接移动到C杆就可以
move(A, C)
//本质是打印:A=====> C

#include <stdio.h>
int count = 0;//计算移动次数
void move(char x, char y)
{printf("%c =====>  %c\n", x, y);count++;
}
int hanoi(int n, char A, char B, char C)// n表示圆盘个数,A,B,C为三个杆子,表示从A经由B移动到C
{if (n == 1)move(A, C);else{hanoi(n - 1, A, C, B);move(A, C);hanoi(n - 1, B, A, C);}
}
int main()
{int n;printf("请输入圆盘数:\n");scanf("%d", &n);count=hanoi(n,'A','B','C');printf("总共移动%d次",count);return 0;
}

总结

  1. 递归程序设计的实质:把一个复杂的问题分解成若干子问题来处理时,其中某些子问题与原问题有相同的特征属性,则可以利用和原问题相同的分析处理方法(注意原问题与子问题能很好衔接)。
  2. 在设计递归函数时候,要将每个递归函数看成简单的操作, 不要想得过于复杂。

浅谈递归函数—C语言相关推荐

  1. 二级C语言上机考试评分标准,浅谈二级C语言上机考试评分原理

    浅谈二级C语言上机考试评分原理 C语言的表现能力和处理能力极强.它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构.下面是小编整理的关于二级C语言上机考试评分原理,希望大家认真阅读! 上机考 ...

  2. 浅谈视觉与语言中的多模态研究,究竟都研究什么

    前言 随着人工智能的整体进步,计算机视觉和自然语言处理已经有了巨大的.有了如此强大的算法和自主系统的综合能力,就需要合并知识领域,实现跨模态兼容,视觉语言(VisLang)研究具有更复杂的任务和交互式 ...

  3. 浅谈计算机程序设计语言,探讨计算机程序设计语言教学

    [文章摘要] 随着社会不断的发展与进步,计算机作为现代先进产物的代表,已经很快的进入到社会中的各行各业.而程序设计作为计算机的核心内容,也同样引起了大家的重视,同时计算机程序设计也是高校开设的一门重要 ...

  4. c语言输出问句接受一个答案,浅谈学习C语言的经过

    回想刚刚接触C语言的时候,简直触目惊心! 楼主加了个嵌入式协会,该协会主要以单片机为主,设计安卓芯片开发等等之类.然而非计算机类专业的苦逼楼主要等到后面一学期学校才会开设相关课程,没办法,只有自己慢慢 ...

  5. 浅谈哪种语言是最好的语言

    不同的语言在类型的开发项目中有着不同的开发优势,真正的高手会根据项目来进行不同的技术选择,所以从本质来说谈论哪种语言是世界上最好的语言是没有意义的.编程语言不过是人类调用计算机的一种技术的手段.真正产 ...

  6. c语言bmp图像均衡化,浅谈应用C语言实现图象灰度的均衡化问题

    摘要通过对灰度直方图进行修正的理论.建模.算法和程序的论述,说明如何实现图象的灰度直方图均衡化,达到图象增强的目的. [关键词]均衡化 灰度 图象增强技术 图象的灰度直方图均衡化是图象增强技术的一种, ...

  7. c语言弱符号与函数指针,浅谈C语言中的强符号、弱符号、强引用和弱引用【转】...

    首先我表示很悲剧,在看<程序员的自我修养--链接.装载与库>之前我竟不知道C有强符号.弱符号.强引用和弱引用.在看到3.5.5节弱符号和强符号时,我感觉有些困惑,所以写下此篇,希望能和同样 ...

  8. 浅谈C语言内存(栈)

    浅谈C语言内存 文章目录 浅谈C语言内存 内存分配 栈 斐波纳契数列 内存分配 在C语言中内存分别分为栈区(stack).堆区(heap).未初始化全局数据区.已初始化全局数据区.静态常量区(stat ...

  9. 基于c语言的递归算法分析论文,浅谈C语言递归算法.docx

    浅谈C语言递归算法 浅析C语言递归算法王浏江盐城师范学院 信息工程学院 计算机161班 摘要:递归算法,结构清晰,代码简练,函数调用灵活方便,比较容易理解和阅读.因此,递归算法一般用于多个相似小问题组 ...

最新文章

  1. wifi管理系统_KJ725(A)精确人员定位管理系统实现对井下人员和车辆的精确定位
  2. CSS3 Flexbox 弹性盒与 css3 阴影效果的演示
  3. SCCM2012SP1---配置客户端发现方法和边界组
  4. 百度超级链XChain(1)系统架构
  5. sqlserver日志管理(转载)
  6. 软件测试个人感悟之测试用例的评审重点是什么?
  7. C#用串口接收事件接不全数据的处理
  8. DNA 8. 癌症的突变异质性及寻找新的癌症驱动基因(MutSigCV)
  9. Print Label with Barcode Using ZPLII
  10. ORACLE 8023学习总结
  11. 网络安全专家教你设置史上最安全的WiFi密码
  12. 第一行代码-第二版(郭霖著)笔记十一(Material Design)
  13. 备份Ubuntu 并制作成iso安装文件
  14. word柱状图垂直轴数值设定_Excel图表中设置坐标轴的字体、图案格式、刻度格式和数字格式的方法...
  15. PHP判断当前的设备是手机(Mobile)还是电脑(PC)
  16. 最小生成树(库鲁斯卡尔算法)
  17. SpringBoot的序列化和反序列化
  18. 计算机u盘被禁用怎么办,笔记本电脑U盘等USB设备被禁用怎么处理
  19. 第14章 LINQ to SOL
  20. SAP PS 第八节 PS 常见问题处理-来源于SAP EPPM分享

热门文章

  1. Linux下分割、合并PDF(pdftk)
  2. Windows 系统无法启动(错误代码:0xc000000e)的修复
  3. Windows10+deepin双系统安装(选用意义,安装教程)
  4. java web 常见框架
  5. 单片机程序生产烧录工具
  6. [XDOJ]矩阵相乘
  7. Linux 运维必备 150 个命令,速度收藏~
  8. 10+编程语言实现云笔记
  9. taro 小程序编译在标签上px转rpx的api
  10. Rust: 基于 napi-rs 开发 Node.js 原生模块