我的编程空间,编程开发者的网络收藏夹
学习永远不晚

函数(2)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

函数(2)

6. 函数的声明和定义

6.1 函数声明:

告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数
声明决定不了。
2. 函数的声明一般出现在函数的使用之前。要满足先声明后使用。
3. 函数的声明一般要放在头文件中的。

函数的声明int Add(int x, int y);int main(){int num1 = 0;int num2 = 0;scanf("%d %d", &num1, &num2);//计算//函数的调用(传值调用)//2int ret = Add(num1, num2);printf("%d\n", ret);return 0;}//函数的定义int Add(int x, int y){return x + y;}

6.2 函数定义

函数的定义是指函数的具体实现,交待函数的功能实现。
函数的定义本就是一种特殊的声明。

#define _CRT_SECURE_NO_WARNINGS 1#include//函数的定义int Add(int x, int y){return x + y;}int main(){int num1 = 0;int num2 = 0;scanf("%d %d", &num1, &num2);//计算//函数的调用(传值调用)//2int ret = Add(num1, num2);printf("%d\n", ret);return 0;}

 以后我们可以把函数的声明放在同一头文件中,这样方便管理。

7. 函数递归

7.1 什么是递归?

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

7.2 递归的两个必要条件

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

7.2.1 练习1:

接受一个整型值(无符号),按照顺序打印它的每一位。
例如:
输入:1234,输出 1 2 3 4

不用递归的方法得到的是这样的

#define _CRT_SECURE_NO_WARNINGS 1#includeint main(){int num = 0;scanf("%d", &num);while (num){printf("%d ", num%10);num = num / 10;}return 0;}

 我们用递归来实现:

#define _CRT_SECURE_NO_WARNINGS 1#includevoid Print(int n){if (n > 9){Print(n/10);}printf("%d ", n % 10);}int main(){int num = 0;scanf("%d", &num);//1234Print(num);return 0;}

其实递归分为两步,递推和回归,我们把递推实现到最后一步再进行回归。

 7.2.2 练习2:

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

大家都知道求字符串长度用strlen就可以了,但是我们用递归的方式也能够实现。

实现我们来看一下strlen实现,strlen函数是统计/0之前的字符串长度,遇到/0就会停止。

strlen这个函数的返回类型是size_t,size_t 类型的数据打印的时候使用%zd,size_t 是一种类型,是无符号整型的,size_t就是为sizeof设计的。

#define _CRT_SECURE_NO_WARNINGS 1#include#includeint main(){char arr[] = "abc";size_t len = strlen(arr);printf("%zd\n", len);return 0;}

我们用递归来实现一下:

用递归来实现的话就相当于模拟实现strlen。数组传参的话传过去的是首元素的地址,传过去的是a的地址,所以我们用char*来接收,我们用if来判断首元素是不是/0,如果不是则+1并且(str+1)统计下一位元素,如此循环往复就可以进行递归了,直到遇到/0停下来。

#define _CRT_SECURE_NO_WARNINGS 1#include#includesize_t my_strlen(char* str){if (*str == '\0')return 0;elsereturn 1 + my_strlen(str + 1);}int main(){char arr[] = "abc";size_t len = my_strlen(arr);//传递的是数组首元素的地址printf("%zd\n", len);return 0;}

 7.3 递归与迭代

7.3.1 练习3:

求n的阶乘。(不考虑溢出)

在数学里面阶乘就是这样定义的,我们可以发现用递归来实现就很容易了。

#define _CRT_SECURE_NO_WARNINGS 1#includeint Fac(int n){if (n <= 1)return 1;elsereturn n* Fac(n - 1);}int main(){int n = 0;scanf("%d", &n);int r = Fac(n);printf("%d\n", r);return 0;}

7.3.2 练习4:

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

斐波那契·数就是前面二个数等于第三个数。

#define _CRT_SECURE_NO_WARNINGS 1#includeint 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;}

 

#define _CRT_SECURE_NO_WARNINGS 1#includeint Fib(int n){int a = 1;int b = 1;int c = 1;while (n >= 3){c = a + b;a = b;b = c;n--;}return c;}int main(){int n = 0;scanf("%d", &n);int ret = Fib(n);printf("%d\n", ret);return 0;}

但是我们发现有问题;
在使用 fib 这个函数的时候如果我们要计算第50个斐波那契数字的时候特别耗费时间。
使用 factorial 函数求10000的阶乘(不考虑结果的正确性),程序会崩溃。
为什么呢?
我们发现 fib 函数在调用的过程中很多计算其实在一直重复。
提示:
1. 许多问题是以递归的形式进行解释的,这只是因为它比非递归的形式更为清晰。
2. 但是这些问题的迭代实现往往比递归实现效率更高,虽然代码的可读性稍微差些。
3. 当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所带来的运行时开销。


这篇文章到这里就结束啦!感谢烙铁们的阅读,下篇我们将详细的讲解数组,让我们下期再见。

来源地址:https://blog.csdn.net/2301_79035870/article/details/132292105

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

函数(2)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

2023-09-06

python 函数(2)

一、内容回顾1.面试题相关:1.py2和py3的区别2.运算符的计算 :3 or 9 and 83.字符串的反转4.is和==的区别5.v1 = (1) v2 = 1 v3 = (1,)有什么区别v1 、v2都是数字,v3是元组6.线上操作
2023-01-31

MySQL函数2

聚合函数(只有一个结果)聚合函数的介绍聚合函数的常用类型(都不含空值)AVG()SUM()MAX()MIN()COUNT()AVG()和SUM()AVG:求平均SUM():求和#求平均工资和工资总和SELECT AVG(salary),SUM(salary)F
MySQL函数2
2014-06-15

Python-2 eval函数

x = 1result = "x+1"result = eval(result)print(result)》》2Python3中字符串不能计算结果,eval函数将字符串当成有效Python表达式来求值,并返回计算结果。与之对应的repr函数
2023-01-31

python 之 函数 2

5.36 命名关键字什么是命名关键字参数? 格式:在*后面参数都是命名关键字参数 特点: 1 必须被传值 2 约束函数的调用者必须按照key=value的形式传值 3 约束函数的调用者必须用我们指定的key名 def foo(x,y,*,z
2023-01-31

2-3 T-SQL函数

2-3 T-SQL函数学习系统函数、行集函数和Ranking函数;重点掌握字符串函数、日期时间函数和数学函数的使用参数以及使用技巧重点掌握用户定义的标量函数以及自定义函数的执行方法掌握用户定义的内嵌表值函数以及与用户定义的标量函数的主要区别
2023-01-31

python内置函数2-bytearra

Help on class bytearray in module __builtin__:class bytearray(object) |  bytearray(iterable_of_ints) -> bytearray. |  by
2023-01-31

python的函数学习2

用来存放名字的地方,有三种名称空间:内置名称空间,全局名称空间,局部名称空间。1 比如执行test.py:2 3 python test.py4 1、python解释器先启动,因而首先加载内置名称空间5 2、执行test.py文件,然后以文
2023-01-30

day 16 - 2 内置函数(二)练习

内置函数(二)练习1、用 map 来处理字符串列表,把列表中所有人都变成 sb,比方 alex_sbname=['alex','wupeiqi','yuanhao','nezha'] name=['alex','wupeiqi','yuan
2023-01-30

asp.net常用函数收藏第1/2页

/// /// 得到站点用户IP /// /// public static string getUserIP() { return HttpContext.
2022-06-07

Numpy中Meshgrid函数介绍及2种应用场景

Meshgrid函数是NumPy中的一个函数,用于生成一个二维坐标网格。它接受两个一维数组作为输入,然后返回两个二维数组,分别表示这两个输入数组的所有可能的组合。具体而言,如果给定两个一维数组x和y,长度分别为m和n,那么meshgrid函
2023-09-20

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录