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. 编写函数不允许创建临时变量,求字符串的长度。

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

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


1. 接受一个整型值(无符号),按照顺序打印它的每一位。

例如数字1234
//1234
//1 2 3 4
//借助于print(1234)函数
//print(123)4
//print(12) 3 4
//print(1) ?2 3 4

再完成代码之前,我们先理以下思路。

假设输出1234,想按顺序打印1 2 3 4 .我们可以创建一个if判断语句,若我们输出的值大于9,那我们用这个数字%10,1234%10=4;随后再用1234/10=123;将123%10=3;再用123/10=12;将12%10=2,再用12/10=1;此时跳出判断,利用递归将其按顺序打印。

#include<stdio.h>
void print(unsigned int n)  //n=1234
{
	if (n > 9)
	{
		print(n / 10);   //print(123)  1 2 3
	}
	printf("%d ", n % 10);
}
int main()
{
	unsigned int num = 0;
	scanf("%d", &num);//1234
	print(num);
	return 0;
}

让我们对上述代码进行画图分析吧:

?

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

再使用递归方法完成此题目之前,我们先看看两个非递归的方法:

法一:库函数strlen法:

#include<stdio.h>
int main()
{
	//求字符串长度
	char arr[] = "abc";
	int len = strlen(arr);
	printf("%d\n", len);
	return 0;
}

?法二:使用自定义函数my_strlen模拟库函数strlen的作用

#include<stdio.h>
int my_strlen(char* s )
{
	int count = 0;
	//printf("%c\n", *s);  打印出a
	while (*s != '\0')
	{
		count++;
		s++;
	}
	return count;
}
int main()
{
	//求字符串长度
	char arr[] = "abc";
	//arr是数组名,数组名是数组首元素的地址
	int len = my_strlen(arr);
	printf("%d\n", len);
	return 0;
}

法三:不创建临时变量,求字符串长度(递归)

#include<stdio.h>
int my_strlen(char* s)
{
	if (*s == '\0')
		return 0;
	else
		return 1 + my_strlen(s + 1);
}
int main()
{
	//求字符串长度
	char arr[] = "abc";
	//arr是数组名,数组名是数组首元素的地址
	int len = my_strlen(arr);
	printf("%d\n", len);
	return 0;
}

同样的,我们也通过画图分析下:

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

法一(循环):

#include<stdio.h>
int main()
{
	int n = 0;
	int i = 0;
	int ret = 1;
	scanf("%d", &n);
	//循环产生1到n-1的数字
	for (i = 1; i <= n; i++)
	{
		ret = ret * i;
	}
	printf("%d\n", ret);

	return 0;
}

法二(递归)

#include<stdio.h>
int fac(int n)
{
	if (n <= 1)
		return 1;
	else
		return n * fac(n - 1);
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = fac(n);
	printf("%d\n", ret);
}

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

斐波那契:

1 1 2 3 5 8 13 21 34 55

第三个数字等于前面两个数字和,最前面两个数字都是1

法一? ?(递归)(此方法不太合适,效率太低)

#include<stdio.h>  
int count = 0;
int fib(int n)
{
	if (n == 3)
		count++;
	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);
	printf("%d\n", count);
	return 0;
}

?

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

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