IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> C语言--函数、递归 -> 正文阅读

[数据结构与算法]C语言--函数、递归

程序的调试实质上就是观察程序运行的中间结果。

函数可以视为一个可以被重复使用的代码片段;之所以有函数:1.可以避免频繁的复制粘贴代码。2.简化了代码的逻辑,方便程序员来理解代码。

函数的分类:1.自定义函数? ?2.库函数(不用自己写的函数)? ? ? ?标准库函数(strlen、scanf、system、printf......)。? ? ? 系统库函数(sleep)? ? ? 第三方库函数(数量更加庞大)

函数调用的时候,形参是实参的一份拷贝~? ? ? ? ?实参ab和形参xy没有任何的关系(唯一的联系就是形参xy创建的时候是通过ab来初始化的)。

?*x和a是完全等价的。通过解引用操作/间接访问操作

根据指针中的地址,找到对应的内存空间。

?

//1.如果是素数返回1,不是返回0
//int isprime(int num) {
//?? ?if (num == 0) {
//?? ??? ?return 0;
//?? ?}
//?? ?if (num == 1) {
//?? ??? ?return 0;
//?? ?}
//?? ?for (int i = 2; i <= num; i++) {
//?? ??? ?if (num % i == 0) {
//?? ??? ??? ?return 0;
//?? ??? ?}
//?? ??? ?else {
//?? ??? ??? ?return 1;
//?? ??? ?}
//?? ??? ?}
//?? ?}

//2.是闰年返回1,不是闰年返回-1
//int isyear(int year) {
//?? ?if ((year % 4 == 0 && year % 100 == 0) || (year % 400 ==0)) {
//?? ??? ?return 1;
//?? ?}
//?? ?else {
//?? ??? ?return -1;
//?? ?}
//}


//3.写一个函数,实现一个整形有序数组的二分查找。
//int isSearch(int arr[], int size, int toFind) {
//?? ?int left = 0;
//?? ?int right = size - 1;
//?? ?int mid = (left + right) / 2;
//?? ?if (arr[mid] < toFind) {
//?? ??? ?//放弃查找左边
//?? ??? ?left = mid + 1;
//?? ?}
//?? ?else if (arr[mid] > toFind) {
//?? ??? ?//放弃查找右边
//?? ??? ?right = mid - 1;
//?? ?}
//?? ?else {
//?? ??? ?return mid;
//?? ??? ?//找到了
//?? ?}
//}

//4. 写一个函数,每调用一次这个函数,就会将num的值增加1。
void add(int* p) {
?? ?*p += 1;
}
int main() {
?? ?int num = 0;
?? ?add(&num);
?? ?printf("%d\n", num);
?? ?//printf("%d\n", isSearch(100,56,1));
?? ?//printf("%d\n", isyear(2000));
?? ?//printf("%d\n", isprime(4));

函数的嵌套调用和链式访问
函数和函数之间可以有机的组合的。
链式访问
把一个函数的返回值作为另外一个函数的参数。
函数声明:extern
1. 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数
声明决定不了。
2. 函数的声明一般出现在函数的使用之前。要满足 先声明后使用
3. 函数的声明一般要放在头文件中的。
函数定义:
函数的定义是指函数的具体实现,交待函数的功能实现

#include <>与#include ""的区别:#include <>是在系统目录中查找头文件;#include ""是在当前项目所在的目录中查找头文件

#pragma once? ? ?在定义头文件的时候需要加上这个指令,防止一个头文件被多次调用(多次调用是没有必要的,反而会增加编译的开销)

函数调用其他函数就是嵌套调用。函数自己调用自己就是递归。

递归的代码看起来没有多少,但是执行过程特别复杂。递归的代码人脑分析起来特别困难。

void printNum(unsigned int num) {
?? ?if (num >= 10) {
?? ??? ?printNum(num / 10);
?? ?}
?? ?printf("%d ",num % 10);
}

int main() {
?? ?printNum(1234);

int mystrlen2(char* str) {
?? ?if (str[0] == '\0') {
?? ??? ?return 0;
?? ?}
?? ?return mystrlen2(str + 1) + 1;
}
int main() {
?? ?printf("%d\n",mystrlen2("abcd"));

求字符串长度、求阶乘...既可以用循环来实现也可以用递归来实现~~? 其实从理论上讲,循环和递归完全是等价的。任何一个递归程序都能转为循环,反之,任何一个循环程序也可以转成递归。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-06 12:28:58  更:2021-10-06 12:31:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 12:12:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码