巩固C语言(七)----递归的深度学习及应用 & 字符串和整数之间的相互转化

本文深入探讨了C语言中的递归概念,详细讲解了递归的深度学习及其实际应用。同时,文章还阐述了字符串与整数之间的相互转换过程,特别是带符号的字符串如何转化为整数的技术细节。
摘要由CSDN通过智能技术生成

一 递归的深度学习及其应用

/*
	题1--50个台阶,每次上一个或者两个台阶,问总共有多少种可能?
	分析:f(50) = f(49)+f(48),第五十个台阶有可能是从第49个或者第48个台阶上来的
	      f(49) = f(48)+f(47),......

	题2--判断一个数组是否是递增的?

	题3--数字置换

	题3--将十进制数转化为二进制数

	注意:任意循环都可以转化为递归,而并不是所有的递归都可以转化为循环,递归的标准算法就是if-else
*/

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

//题1--利用递归算法
long long go(int n)
{
	if (n == 1)				//终止条件
		return 1;
	else if (n == 2)
		return 2;
	else
		return go(n - 1) + go(n - 2);		//数学关系
}

//题1--使用循环算法,这种方法相对于递归算法要快很多
long long go2(int n)
{
	
	long long *arr =(long long *)malloc(n*sizeof(long long));
	arr[0] = 1;
	arr[1] = 2;
	for (int i = 2; i < n; i++)
		arr[i] = arr[i - 1] + arr[i - 2];
	


	return arr[n-1];
}

//题2--使用循环算法
void judge(int arr[], int sz)
{
	
	for (int i = 0; i < sz - 2; i++)
	{
		if (arr[i]>arr[i + 1])
		{
			printf("非递增\n");
			return;
		}
	}
	printf("递增\n");
}

//题2--使用递归算法
int judge2(int arr[], int sz)
{
	if (sz == 1)
		return arr[0] < arr[1];
	else
		return (arr[sz - 2] < arr[sz - 1]) && judge2(arr, sz - 1);	//将所有结果级联起来
}

//题3---使用循环
int transfer()
{
	int num;
	printf("请输入一个整数:");
	scanf("%d", &num);
	int lastres = 0;
	while (num)
	{
		lastres *= 10;
		int wei = num % 10;
		lastres += wei;
		num /= 10;
	}
	return lastres;
}

//题4--递归算法
void TenToTwo(int num)
{
	if (num)
	{
		int res = num % 2;
		num /= 2;
		TenToTwo(num);
		printf("%d", res);
	}
}



void main()
{
	//递归计算题1
	double sec;
	clock_t start, finish;
	start = clock();
	printf("递归 = %lld\t", go(40));
	finish = clock();
	sec = (finish - start) / CLOCKS_PER_SEC;
	printf("耗时:%f seconds\n", sec);

	//循环计算题1
	start = clock();
	printf("循环 = %lld\t", go2(40));
	finish = clock();
	sec = (finish - start) / CLOCKS_PER_SEC;
	printf("耗时:%f seconds\n", sec);

	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	//循环计算题2
	judge(arr, sizeof(arr) / sizeof(int));
	//递归计算题2
	if (judge2(arr, sizeof(arr) / sizeof(int)))
		printf("递增\n");
	else
		printf("非递增\n");

	//循环计算题3
	printf("%d\n", transfer());

	//递归计算题4
	int num = 0;
	printf("请输入要转换的整数:");
	scanf("%d", &num);
	TenToTwo(num);

	system("pause");
}

运行结果:
递归 = 165580141        耗时:4.000000 seconds
循环 = 165580141        耗时:0.000000 seconds
递增
递增
请输入一个整数:123456
654321
请输入要转换的整数:23
10111请按任意键继续. . .

二 字符串和整数之间的相互转换

/*
	将字符串转化为数字,如"12345"转为12345
	将整数转化为字符串,如12345转为"12345"
*/

#include<stdio.h>
#include<stdlib.h>

//将字符串转化为整数
int StrToInt(char *str)
{
	int num = 0;
	while ((*str))
	{
		if ((*str >= '0' && *str <= '9'))
		{
			num *= 10;
			num += ((*str) - '0');
			str++;
		}
		else
			return -1; 
	}
	return num;
}

//将整数转为化字符串
char *IntToStr(int num)
{
	int n = 0;
	int temp = num;
	//求出位数
	while (temp)
	{
		temp /= 10;
		n++;
	}
	//动态申请一维数组
	char *ch = (char *)malloc(n*sizeof(char));
	char *chT = ch;
	int numT = n;
	while (num)
	{
		int res = num % 10;
		chT[n-1] = res + '0';
		n--;
		num /= 10;
	}
	chT[numT] = '\0';

	return ch;
}

void main()
{
	char *ch = "123456789";
	printf("字符串%s转为为整数为%d\n", ch, StrToInt(ch));

	int num = 654321;
	printf("数字%d转化字符串为%s\n", num, IntToStr(num));

	system("pause");
}

运行结果:
字符串123456789转为为整数为123456789
数字654321转化字符串为654321
请按任意键继续. . .

三 带符号的字符串转化为整数


#include<stdio.h>
#include<stdlib.h>

/*
	将字符串转换为整数的函数在stdlib.h中定义:
	int atoi(const char *str);
	atoi函数会跳过str中前面出现的空格,从第一个数字开始转换。

	注意:
		1.参数检验。始终要放在最开始,在输入是指针的情况下,永远不要忘记首先检验是否是NULL指针;
		2.字符串开始处的空格(我还加入了制表符)要注意跳过;
		3.符号,不要忘了数字字符串第一个字符可能出现加号和减号!
*/
int StrToInt(char *str)
{
	assert(str != NULL);
		
	int ret = 0, sign = 1;

	//跳过空格
	for (; *str == ' ' || *str == '\t'; str++);
	//判断符号
	if (*str == '-') sign = -1;
	//跳过符号位
	if (*str == '-' || *str == '+') str++;
	//判断是否在字符'0'和'9'之间
	while (*str <= '9' && *str >= '0')
	{
		ret = ret * 10 + *str - '0';
		str++;
	}

	return sign*ret;
}


/*
	对于将数字转换为字符串,c标准中并没有定义(itoa只是在一些编译器中自己定义)。
	c标准中没有定义的原因我觉得是数字转成字符串可以使用sprintf格式化输出函数来完成。
	当然我们可以自己编写一个itoa函数。
*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值