一 递归的深度学习及其应用
/*
题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函数。
*/