iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >函数(2)
  • 319
分享到

函数(2)

c语言学习开发语言 2023-09-06 08:09:37 319人浏览 独家记忆
摘要

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

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

--结束END--

本文标题: 函数(2)

本文链接: https://www.lsjlt.com/news/396676.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 函数(2)
    6. 函数的声明和定义 6.1 函数声明: 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数 声明决定不了。 2. 函数的声明一般出现在函数的使用之前。要满足先声明后使用。 3. 函数的声明一般要放在头文件...
    99+
    2023-09-06
    c语言 学习 开发语言
  • python 函数(2)
    一、内容回顾 1.面试题相关: 1.py2和py3的区别 2.运算符的计算 :3 or 9 and 8 3.字符串的反转 4.is和==的区别 5.v1 = (1) v2 = 1 v3 = (1,)有什么区别 v1 、v2都是数...
    99+
    2023-01-31
    函数 python
  • python 之 函数 2
    5.36 命名关键字 什么是命名关键字参数? 格式:在*后面参数都是命名关键字参数 特点: 1 必须被传值 2 约束函数的调用者必须按照key=value的形式传值 3 约束函数的调用者必须用我们指定的key名 def foo(x,y,...
    99+
    2023-01-31
    函数 python
  • Python-2 eval函数
    x = 1result = "x+1"result = eval(result)print(result)》》2 Python3中字符串不能计算结果,eval函数将字符串当成有效Python表达式来求值,并返回计算结果。 与之对应的repr...
    99+
    2023-01-31
    函数 Python eval
  • 2-3 T-SQL函数
      2-3 T-SQL函数 学习系统函数、行集函数和Ranking函数;重点掌握字符串函数、日期时间函数和数学函数的使用参数以及使用技巧 重点掌握用户定义的标量函数以及自定义函数的执行方法 掌握用户定义的内嵌表值函数以及与用户定义的标量函...
    99+
    2023-01-31
    函数 SQL
  • python内置函数2-bytearra
    Help on class bytearray in module __builtin__:class bytearray(object) |  bytearray(iterable_of_ints) -> bytearray. | ...
    99+
    2023-01-31
    函数 python bytearra
  • python的函数学习2
    用来存放名字的地方,有三种名称空间:内置名称空间,全局名称空间,局部名称空间。 1 比如执行test.py: 2 3 python test.py 4 1、python解释器先启动,因而首先加载内置名称空间 5 2、执行test.p...
    99+
    2023-01-30
    函数 python
  • day 16 - 2 内置函数(二)练习
    内置函数(二)练习 1、用 map 来处理字符串列表,把列表中所有人都变成 sb,比方 alex_sbname=['alex','wupeiqi','yuanhao','nezha']   name=['alex','wupeiqi',...
    99+
    2023-01-30
    函数 day
  • C++常用字符串函数大全(2)
    目录1、cstring.h常用函数介绍2、strlen3、strcat4、strncat5、strcpy6、strncpy7、memset8、memcpy9、strcmp10、str...
    99+
    2024-04-02
  • 代码详解Python的函数基础(2)
    目录1.函数参数2.递归函数总结1.函数参数 # 1.位置参数:调用函数时,传入的值需要按照位置顺序传入 # 实例:求x的n次方 def xPowN(x,n): # 传...
    99+
    2024-04-02
  • PostgreSQL 源码解读(146)- Storage Manager#2(fsm_search_avail函数)
    本节简单介绍了PostgreSQ...
    99+
    2024-04-02
  • Python 内置函数详解 (2) 逻辑运算
    近期在外旅游,本篇是出发编辑的,准备定时发布用,不完整,旅游回来后再补充。 Python 内置函数 Python3.11共有75个内置函数,其来历和分类请参考:Python 新版本有75个内置函数,你不会不知道吧_Hann Yang的博客...
    99+
    2023-09-20
    python
  • Numpy中Meshgrid函数介绍及2种应用场景
    Meshgrid函数是NumPy中的一个函数,用于生成一个二维坐标网格。它接受两个一维数组作为输入,然后返回两个二维数组,分别表示这...
    99+
    2023-09-20
    Numpy
  • 【C++心愿便利店】No.2---函数重载、引用
    文章目录 前言🌟一、函数重载🌏1.1.函数重载概念🌏1.2.C++支持函数重载的原理 -- 名字修饰 🌟二、引用dz...
    99+
    2023-09-22
    c++ 开发语言
  • PostgreSQL 源码解读(133)- MVCC#17(vacuum过程-lazy_vacuum_index函数#2)
    本节简单介绍了PostgreSQ...
    99+
    2024-04-02
  • 如何在 MySQL DATEDIFF() 函数中使用 2 位年份值?
    我们可以在单个日期表达式或在 MySQL DATEDIFF() 函数中用作参数的两个日期表达式中使用 2 位年份值。例如,下面的查询使用 2-第一个日期表达式中的数字年份值,其他日期表达式具有 4 位数的年份值。mysql> Sele...
    99+
    2023-10-22
  • Python学习笔记(11-2):matplotlib绘图——图形绘制函数
    Python学习笔记(11-2):matplotlib绘图——图形绘制函数 一、设置参数的预备知识1、常见的绘图参数(1)曲线设置参数(2)数据点标记(marker)的设置参数(3)其他参数...
    99+
    2023-10-26
    python matplotlib 学习
  • PostgreSQL 源码解读(2)- 插入数据#2(RelationPutHeapTuple)
    本文简单介绍了PG插入数据部分的源码,主要内容包括RelationPutHeapTuple函数的实现逻辑。 一、数据结构/宏定义/通用函数 RelationPutHeapTuple...
    99+
    2024-04-02
  • Numpy中Meshgrid函数基本用法及2种应用场景
    目录引言Meshgrid函数的基本用法Meshgrid函数的一些应用场景总结引言 近期在好几个地方都看到meshgrid的使用,虽然之前也注意到meshgrid的用法。 但总觉得印象...
    99+
    2024-04-02
  • Python数学基础2
    1.Python中使用对数函数 log(x)就是数学中的ln(x),log10(x)就是数学中的lg(x)。 import numpy as np#对XY取lnX = np.log(X) # 对X,...
    99+
    2023-10-20
    python numpy
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作