C语言程序设计P5-3【应用函数进行程序设计 | 第三节】——知识要点:函数的嵌套调用和递归调用

知识要点:函数的嵌套调用和递归调用

视频

目录

一、任务分析

二、必备知识与理论

三、任务实施


一、任务分析

本任务要求用递归法求 n!。

我们知道n!=n×(n-1)×(n-2)×……×1=n(n-1)!递归公式为:

1.上面公式分解为n!=n×(n-1)!,即将求n!的问题变为求(n-1)!的问题,(n-1)!= (n-1)×(n-2)!,即将求(n-1)!的问题变为求(n-2)!的问题,再将求(n-2)!的问题变为求(n-3)!的问题,依此类推,直到最后成为求0!,这是递推过程;

2.反过来求0!=1,1!,2!,3!,……,n!,为“回归过程”。

二、必备知识与理论

 1.函数的嵌套调用

在C语言中,函数定义都是互相平行、独立的模块,无隶属关系,只存在调用和被调用的关系,除了主函数不能被其他函数调用外,其它函数之间都可以互相调用。

【例5.4】写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。

算法分析:在数学上,两数的最小公倍数=两数乘积/两数的最大公约数。

求两个数的最大公约数应用辗转相除法:已知两个整数M和N,假定M>N,则求M%N,若余数r为0,则N即为所求;若余数r不为0,用N除r,再求其余数……直到余数为0,则除数就是M和N的最大公约数。

程序代码如下:

#include <stdio.h>int gcd(int a,int b)  /* 求最大公约数——辗转相除法 */{ int r,t;if(a<b){t=a;a=b;b=t;}r=a%b;while(r!=0){a=b;b=r;r=a%b; }return (b);}int lcm(int a,int b)   /* 求最小公倍数 */{int r;r=gcd(a,b);return(a*b/r);}main()   /* 主函数 */{int x,y; printf("please input two numbers:\n"); scanf("%d,%d",&x,&y); printf("%d\n",gcd(x,y));printf("%d\n",lcm(x,y));}

运行结果:

please input two numbers:

66,78↙

6

     858

在这个例子中,主函数首先调用了函数gcd()求最大公约数,然后调用函数lcm()求最小公倍数,而在函数lcm()中又调用了函数gcd(),这就是一个函数嵌套调用的过程。

注意:①函数之间没有从属关系,一个函数可以被其它函数调用,同时该函数也可以调用其它函数。

②在C语言中,函数可以嵌套调用,但不可以嵌套定义。

2.函数的递归调用

函数的递归调用实际上是函数嵌套调用的一种特殊情况。在调用一个函数的过程中直接或间接地调用该函数本身,称为函数的递归调用。直接调用称为直接递归调用,间接调用称为间接递归调用。程序中常用的是直接递归。将这种在函数体内调用该函数本身的函数称为递归函数。

三、任务实施

用递归的方法求n!

我们知道n!=n×(n-1)×(n-2)×……×1=n(n-1)!递归公式为:

算法分析:

(1)上面公式分解为n!=n×(n-1)!,即将求n!的问题变为求(n-1)!的问题,(n-1)!= (n-1)×(n-2)!,即将求(n-1)!的问题变为求(n-2)!的问题,再将求(n-2)!的问题变为求(n-3)!的问题,依此类推,直到最后成为求0!,这是递推过程;

(2)反过来求0!=1,1!,2!,3!,……,n!,为“回归过程”。

(3)以求4的阶乘为例,4!=4×3!,3! =3×2!,2!=2×1!,1!=1,0!=1,它的递归结束条件是当n=1或n=0时,n!=1。

#include <stdio.h>float fac(n){ float f;if(n<0) printf("n<0,data error\n");else if(n==0||n==1) f=1;else f=fac(n-1)*n;   /* 递归调用 */return(f);}main(){int n;float y;printf("input an integer number:");scanf("%d",&n);y=fac(n);    /* 调用递归函数 */printf("%d!=%10.0f\n",n,y);}

运行情况如下:

input an integer number:4↙

4!=        24

递归过程分为两个阶段,第一阶段是“回推”阶段,即将求解4!变成求解4×3!,3!变成求解3×2!……直到1!=1为止;第二阶段是“递推”阶段,即根据2×1!得到2!,再根据3×2!得到3!,4×3!得到4!,结果为24。显然,在一个递归过程中,回推阶段是有限的递归调用过程,这样就必须要有递归结束条件,否则会无限地递归调用下去。

本例的递归结束条件为:当n的值为0或为1时,fac(n)的值为1; n<0时,作为错误输入数据。

在递推阶段中,函数执行完后必定要返回主调函数,通过return语句将fac(n)的值带回到上一层fac(n)函数,一层一层返回,最终在主函数中得到fac(4)的结果。

注意:一个合法的递归应该由两部分构成,一是递推公式,二是结束条件,缺少任何一个都无法利用递归解决问题。

最后对递归函数作如下概括:

(1)有些问题既可以用递归的方法解决,也可以用递推的方法解决。有些问题不用递归是难以得到结果的,如汉诺塔。某些问题,特别是与人工智能有关的问题,本质上是递归的。

(2)递归函数算法清晰,代码简练。如汉诺塔问题可谓复杂,程序却极为简单。

(3)从理论上讲,递归函数似乎很复杂,其实它是编程中一类问题的算法,最为直 接。一旦熟悉了递归,它就是处理这类问题的最清晰的方法。

(4)C编译系统对递归函数的自调用次数没有限制,但当递归层次过多时,可能会引起内存不足而造成运行出错,尤其是函数内部定义较多的变量和较大的数组时。

(5)函数递归调用时,在栈上为局部变量和形参分配存储空间,并从头执行函数代 码。递归调用并不复制函数代码,只是重新分配相应的变量,返回时再释放存储空间。递归需要保存变量、断点、进栈、出栈,增加许多额外的开销,会降低程序的运行效率,所以程序设计中又有一个递归消除的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/485736.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css部分

前面我们学习了HTML&#xff0c;但是HTML仅仅只是做数据的显示&#xff0c;页面的样式比较简陋&#xff0c;用户体验度不高&#xff0c;所以需要通过CSS来完成对页面的修饰&#xff0c;CSS就是页面的装饰者&#xff0c;给页面化妆&#xff0c;让它更好看。 1 层叠样式表&#…

单片机的中断系统

作者简介 彭煜轩&#xff0c;男&#xff0c;银川科技学院计算机与人工智能学院&#xff0c;2022级计算机与科学技术8班本科生&#xff0c;单片机原理及应用课程第3组。 指导老师&#xff1a;王兴泽 电子邮件&#xff1a;1696409709qq.com 前言 本篇文章是参考《单片机原理…

【技巧】Mac上如何显示键盘和鼠标操作

在制作视频教程时&#xff0c;将键盘和鼠标的操作在屏幕上显示出来&#xff0c;会帮助观众更容易地理解。 推荐Mac上两款开源的小软件。 1. KeyCastr 这款工具从2009年至今一直在更新中。 https://github.com/keycastr/keycastr 安装的话&#xff0c;可以从Github上下载最…

ARM架构-Cache的底层原理

在主存与处理器之间加入一个小容量的存储器保存 CPU 最近一段时间内的历史访问数据&#xff0c;将在 CPU 发起访问的时候优先提供数据快速访问&#xff0c;这个介于 CPU 与主存储器之间的小容量高速存储空间我们称之为 Cache&#xff0c;即高速缓存。Cache 作为处理器与主存之间…

Flutter:商品多规格内容总结,响应式数据,高亮切换显示。

如图所示&#xff1a; 代码为练习时写的项目&#xff0c;写的一般&#xff0c;功能实现了&#xff0c;等以后再来优化。 自己模拟的数据结构 var data {id:1,name:精品小米等多种五谷杂粮精品小等多种五谷杂粮,logo:https://cdn.uviewui.com/uview/swiper/1.jpg,price:100.5…

团队管理中如何做好目标管理

团队管理中的目标管理是确保团队高效运行的核心要素之一。 在目标管理中&#xff0c;清晰的目标设定、合理的资源分配、实时的跟踪与反馈机制是成功的关键。首先&#xff0c;设定SMART目标&#xff08;具体、可衡量、可达成、相关性强、时间限定&#xff09;能够有效聚焦团队的…

Unity在运行状态下,当物体Mesh网格发生变化时,如何让MeshCollider碰撞体也随之实时同步变化?

旧版源代码地址&#xff1a;https://download.csdn.net/download/qq_41603955/90087225?spm1001.2014.3001.5501 旧版效果展示&#xff1a; 新版加上MeshCollider后的效果&#xff1a; 注意&#xff1a;在Unity中&#xff0c;当你动态地更改物体的Mesh时&#xff0c;通常期望…

Blender导入下载好的fbx模型像的骨骼像针戳/像刺猬

为什么我下载下来的骨骼模型和我自己绑定的模型骨骼朝向完全不一样 左边是下载的模型 右边是我自己绑定的模型 左边的模型刚刚感觉都是像针一样往外戳的&#xff0c;像刺猬一样那种。 解决方法勾选自动骨骼坐标系

基于Springboot+Vue的在线答题闯关系统

基于SpringbootVue的在线答题闯关系统 前言&#xff1a;随着在线教育的快速发展&#xff0c;传统的教育模式逐渐向互联网教育模式转型。在线答题系统作为其中的一个重要组成部分&#xff0c;能够帮助用户通过互动式的学习方式提升知识掌握度。本文基于Spring Boot和Vue.js框架&…

矿区新发现,改造明星profinet转profibus协议网关也有未来

profinet转profibusDP协议网关&#xff0c;在矿区的一些老设备上&#xff0c;改造升级一定会遇到profibus无法通讯的情况&#xff0c;选择一个协议模块网关是性价比的首选&#xff0c;下面介绍一下协议网关的一些指标 PROFINET 在 PROFIBUS 一侧为 PROFIBUS DP 从站&#xff0…

高效查找秘密武器一:位图

有这样的一个问题&#xff1a; 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个数 中。 那么我们一般会想到这样做的 1.遍历&#xff0c;时间复杂度O(n) 2.排序&#xff08;N*logN&#xff09;&#xff0c…

《单片机原理及接口技术》(C51编程)(第三版)------张毅刚主编

1.整体框架&#xff1a;1-22题&#xff08;17-20为编程题分别源自数中的P98,P162,P177页&#xff09; 2.简答题部分&#xff1a; 3.计算题 4.程序题/编程题

Vision Transformer (ViT) 基本原理

Vision Transformer (ViT) 基本原理 flyfish Vision Transformer (ViT) 是一种基于 Transformer 架构的计算机视觉模型 一、ViT 的基本原理 ViT 的核心思想是将一张图像视为一组序列&#xff0c;将其嵌入到 Transformer 的输入中&#xff0c;通过自注意力机制捕获全局上下文…

工业异常检测-CVPR2024-新的3D异常数据合成办法和自监督网络IMRNet

论文&#xff1a;https://arxiv.org/pdf/2311.14897v3.pdf 项目&#xff1a;https://github.com/chopper-233/anomaly-shapenet 这篇论文主要关注的是3D异常检测和定位&#xff0c;这是一个在工业质量检查中至关重要的任务。作者们提出了一种新的方法来合成3D异常数据&#x…

三款电容麦的对比

纸面参数 第一款麦克风 灵敏度: -36 dB 2 dB&#xff08;0 dB1V/Pa at 1 kHz&#xff09; 灵敏度较低&#xff0c;需要更高的增益来拾取同样的音量。频率响应: 40 Hz - 18 kHz 响应范围较窄&#xff0c;尤其在高频区域。等效噪音级: ≤18 dB&#xff08;A计权&#xff09; 噪…

easyexcel 导出日期格式化

1.旧版本 在新的版本中formate已经被打上废弃标记。那么不推荐使用这种方式。 2.推荐方式 推荐使用另外一种方式【 Converter 】代码如下&#xff0c;例如需要格式化到毫秒【yyyy-MM-dd HH:mm:ss SSS】级别 创建一个公共Converter import com.alibaba.excel.converters.Conv…

PPT怎样做的更加精美

目录 PPT怎样做的更加精美 3D的GIF图片 3维空间图​编辑 结果有明显的对比 阅读高质量文献,采用他们的图 PPT怎样做的更加精美 3D的GIF图片 3维空间图 结果有明显的对比

插入排序⁻⁻⁻⁻直接插入排序希尔排序

引言 所谓的排序&#xff0c;就是使一串记录按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 常见的排序算法有&#xff1a; 今天我们主要学习插入排序的直接插入排序和希尔排序。 直接插入排序 什么是直接插入排序&#xff1f; 直接插入排序其…

鸿蒙UI开发——亮/暗色模式适配

1、概 述 系统存在深浅色两种显示模式&#xff0c;为了给用户更好的使用体验&#xff0c;应用最好适配暗色和亮色两种模式。从应用与系统配置关联的角度来看&#xff0c;适配暗色和亮色模式可以分为下面两种情况&#xff1a; 应用跟随系统的深浅色模式&#xff1b; 应用主动设…

推荐在线Sql运行

SQL Fiddle 1、网址&#xff1a;SQL Fiddle - Online SQL Compiler for learning & practiceDiscover our free online SQL editor enhanced with AI to chat, explain, and generate code. Support SQL Server, MySQL, MariaDB, PostgreSQL, and SQLite.http://www.sqlfi…