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语言系列第三章——函数(下)

6.函数的声明和定义

6.1函数声明:

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

6.2函数定义:

函数定义是函数的具体实现,交代函数的功能实现。
test.h的内容:放置函数声明

//函数的声明
int Add(int x, int y);

test.c的内容:函数定义

int Add(int x, int y)
{
return x+y;
}

7.函数递归

7.1什么是递归?

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

7.2递归的两个必要条件

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

7.2.1练习1

接收一个整形值,按顺序打印每一位
例如:1234 打印:1 2 3 4

void print(int num)
{
	if (num > 9)
	{
		print(num / 10);
	}
	printf("%d ", num % 10);
}
int main()
{
	unsigned int num = 0;
	scanf("%d", &num);
	print(num);
	return 0;
}

7.2.2练习2

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

int Strlen(char* arr)
{
	if ('\0' == *arr)
		return 0;
	else
		return 1 + Strlen(arr + 1);
	
}
int main()
{
	char arr[] = "abcdef";
	int len = Strlen(arr);
	printf("%d\n", len);
	return 0;
}

7.3递归与迭代

7.3.练习

求n的阶乘(递归)

int fac(int n)
{
	if (n <= 1)
		return 1;
	else
		return n * fac(n - 1);
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int z = fac(n);
	printf("%d\n", z);
	return 0;
}

非递归

int fac(int n)
{
	int i = 0;
	int ret = 1;

	for (i = 1; i <= n; i++)
	{
		ret *= i;

	}
	return ret;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int z = fac(n);
	printf("%d\n", z);
	return 0;
}

7.3.2练习

斐波那契数列:
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……

规律是:这个数列从第3项开始,每一项都等于前两项之和。
斐波那契数列(递归)

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

非递归

int fib(int n)
{
	int a = 1;
	int b = 1;
	int c = 1;
	while (n > 2)
	{
		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;
}

栈溢出(stack overflow):系统分配给程序的栈空间是有限的,但是如果出现了死循环,或者(死递归),这样有可能导致一直开辟空间,最终产生空间耗尽的情况。

如何解决死递归问题:
1.将递归改写成非递归。
2.使用static对象替代nonstatic局部对象。在函数设计中,可以使用static对象代替nonstatic局部对象(栈对象),这不仅可以减少每次递归调用和返回时产生和释放nonstatic对象的开销,而且static对象还可以保存递归调用的中间状态,并且可为各个调用层所访问。
提示:
1.许多问题是以递归的形式进行解释的,这只是因为它比非递归的形式更加清晰。
2.但是这些问题的迭代实现往往比递归实现的效率更高,虽然代码的可读性稍微差些。
3.当一个问题相当复杂,难以用迭代实现时,此时递归的简洁性便可以补偿它所带来的运行开销。
函数递归的几个经典题目(自主研究):
1.汉诺塔问题
2.青蛙跳台阶问题
结语:
今天就是除夕了,在新的一年希望我们一起加油,完善自我。
在这里插入图片描述
求求给个三连吧!
在这里插入图片描述

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-01 20:51:59  更:2022-02-01 20:53:48 
 
开发: 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年11日历 -2024/11/26 17:23:52-

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