本部分包含程序流程结构 练习题:1.编写从1-100的所有整数中出现了多少个数字9 。2.计算1/1-1/2+1/3-1/5+1/6+...+1/99-100/1。3.求10个整数的最大值。4.在屏幕上输出9*9乘法口诀表。5.猜数字。以及函数练习题:1.实现一个函数,打印乘法口诀,口诀列表的行和列自己指点,如输入12,输出12*12乘法口诀。2.递归实现 将参数字符串中的字符反向排列。3.递归实现,计算每一个数的每位之和。4.递归实现,实现n的k次方。
笔记:
函数递归
- 函数递归的定义
- 程序调用自身的编程技巧称为递归( recursion)。
- 递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接 调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
- 递归的主要思考方式:把大事化小
- 递归的两个必要条件
- 存在限制条件,当满足这个限制条件的时候,递归便不再继续。
- 每次递归调用之后越来越接近这个限制条件,且递归层次不要太深。
- 系统分配给程序的栈空间是有限的,但是如果出现了死循环,或者(死递归),这样有可能导致一直开辟栈空间,最终产生栈空间耗尽的情况,这样的现象我们称为栈溢出。
- 递归与迭代
- 许多问题是以递归的形式进行解释的,这只是因为它比非递归的形式更为清晰。
- 但是这些问题的迭代实现往往比递归实现效率更高,虽然代码的可读性稍微差些。
- 当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所带来的运行时开销。
代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<windows.h>
void Mut(int num)
{
for (int i = 1;i <= num;i++)
{
for (int j = 1;j <= i;j++)
{
printf("%d*%d=%d ", i, j, i * j);
}
printf("\n");
}
}
int my_strlen(char* arr)
{
int count = 0;
while (*arr != 0)
{
count++;
*arr++;
}
return count;
}
//递归实现 将参数字符串中的字符反向排列
void reverse_string(char* arr)
{
int right = 0;
int left = my_strlen(arr) - 1;
int temp = 0;
while (right < left)
{
temp = arr[right];
arr[right] = arr[left];
arr[left] = temp;
right++;
left--;
}
printf("%s", arr);
}
void reverse_string(char* arr)
{
char temp = *arr;
int length = my_strlen(arr);
*arr = *(arr + length - 1);
*(arr + length - 1) = '\0';
if (my_strlen(arr + 1) >= 2)
{
reverse_string(arr + 1);
}
*(arr + length - 1) = temp;
}
//递归实现,计算每一个数的每位之和
int numAdd(int num)
{
int Add = 0;
if (num > 9)
return numAdd(num / 10) + num % 10;
else
return num;
}
int numMut(int num,int k)
{
int sum = 0;
if (k > 0)
return num * numMut(num, k - 1);
else if (k < 0)
return 1/(numMut(num, -k));
else
return 1;
}
int main()
{
//程序流程结构 练习题
//编写从1-100的所有整数中出现了多少个数字9
int count = 0;
printf("1 - 100的所有整数中出现了数字9的数有 ");
for (int i = 0;i < 100;i++)
{
if (i % 10 == 9)
{
printf("%d ", i);
count++;
}
}
printf(" 一共有%d个\n ", count);
//计算1/1-1/2+1/3-1/5+1/6+...+1/99-100/1
double num = 0.0;
printf("\n计算1/1-1/2+1/3-1/5+1/6+...+1/99-100/1\n ");
for (int i = 1;i <= 100;i++)
{
if (i % 2 == 0)
{
num -= 1.0 / i;
}
else
{
num += 1.0 / i;
}
}
printf("%lf ", num);
//求10个整数的最大值
int arr[] = { 1,2,3,4,15,6,7,8,9,10 };
int max = 0;
for (int i = 0;i < 10;i++)
{
if (arr[i] > max)
{
max= arr[i];
}
}
printf("%d", max);
//在屏幕上输出9*9乘法口诀表
for (int i = 1;i < 10;i++)
{
for (int j = 1;j <= i;j++)
{
printf("%d*%d=%d ", i, j, i * j);
}
printf("\n");
}
//猜数字
srand((unsigned int)time(NULL));
int random = rand()%100+1;
int input = 0;
printf("开始猜数字游戏:\n请输入");
while (1)
{
scanf("%d", &input);
if (input == random)
{
printf("猜对啦!游戏结束!");
break;
}
else if(input>random)
{
printf("猜大啦!");
}
else if (input < random)
{
printf("猜小啦!");
}
}
//函数练习题
//实现一个函数,打印乘法口诀,口诀列表的行和列自己指点,如输入12,输出12*12乘法口诀
int num = 0;
printf("请输入行列:");
scanf("%d", &num);
Mut(num);
//递归实现 将参数字符串中的字符反向排列
char arr[] = "abcde";
reverse_string(arr);
printf("%s", arr);
//递归实现,计算每一个数的每位之和
int num = 1234;
printf("%d", numAdd(num));
//递归实现,实现n的k次方
int n = 0;
int k = 0;
scanf("%d %d", &n, &k);
printf("值为%d", numMut(n, k));
}


被折叠的 条评论
为什么被折叠?



