目录
💕1)
💕2)
❤️3.习题介绍
❤️ 希望各位能有所收获
1.什么是函数递归
1)递归定义
程序的自身编程技巧是递归(简单来说它是一种巧妙的代码实现方式)。
2)递归主要思考方式(把大事化小)
递归的思想通常是把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题求解。(简单来说就是我们建楼房一层一层的往上建楼直到达到我们需要的楼层)
3)递归的优点
递归可以大大的减少程序代码量
2.递归的两个必要条件
1)
存在限制条件,当满足这个条件,即递归不在继续。(为什么呢? 因为如果不存在限制的条件我们的函数就会一直被调用,这样一来就成了一个死循环,最后导致栈溢出)
(栈溢出解释: 我们知道,当我们函数调用的时候会在栈的区域给定空间,如果你一直调用,那么一直申请空间,就会导致栈的空间不够,即溢出,就会报错)
2)
每次递归调用之后必须越来越接近这个限制条件(为什么呢? 即使我们存在了限制条件,但我们没有一个调整,它也会一直调用,也就是说 这是一个结束递归的一个标准)
3.习题介绍
1) 打印一个整数的每一位 (递归实现)
题目:输入1234 输出 1 2 3 4
这道题我们首先能想到就是先得到每一个数再去打印出每一个数,得到末尾数的方式是模10(%10)我们得到的数字顺序 就是4 3 2 1 但是题目要求是 1 2 3 4,不妨这样,我们先去打印(123) 把 4 放着 ,然会再从123 中先去打印 (12) 把 3放着 然后再从12中打印1 把2放着,这样就可以实现代码
代码如下:
#include <stdio.h>
void print(int n)
{
if (n > 9) //大于9是因为1/10 为0 条件为假 就不进if中
{
print(n / 10);
}
printf("%d ", n % 10);
}
int main()
{
int n = 0;
scanf("%d", &n);
print(n);
return 0;
}
运行结果
2)求n的阶乘 (递归实现)
首先我们要知道n的阶层怎么算,例如: 5!
代码如下
#include <stdio.h>
int stratum(int n)
{
if (n <= 2) // 因为1和2 的阶层就是本身
return n;
else
return n * stratum(n - 1);
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = stratum(n);
printf("%d\n", ret);
return 0;
}
运行结果
3) 字符串逆序 (递归实现)
字符串的逆序输入跟我们的第一题有点类似,字符串逆序输出就是先将后面的先打印,这里我们知道字符串的结束标志是 ‘\0’,那我们就用指针去和字符串去一一对比如果等于了条件不满足就输出这时候的字符f,再返回输出e......
代码如下:
#include <stdio.h>
void reverse_string(char* p)
{
if (*p != '\0')
{
reverse_string(p + 1); // p+1 是让指针与下一个值比较
}
printf("%c ", *p);
}
int main()
{
char arr[] = "abcdef";
reverse_string(arr);
return 0;
}
运行结果:
4) 计算一个数的每位之和 (递归实现)
这道题也跟第一题有点类似,为啥这么说呢,因为我们需要每一个值,再把他们相加,那么我们怎样去实现他们相加呢,想要的到余数还是去模10(%10),将其与递归相加
代码如下:
#include <stdio.h>
int DigitSum(int n)
{
while (n > 9)
{
return n % 10 + DigitSum(n / 10); //这里就是以此记录每个取模结果,相加返回就行
}
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = DigitSum(n);
printf("%d\n", ret);
return 0;
}
运行结果:
5) k的n次方 (递归实现)
既然k的n次方知道是n个k相乘,不如就
代码如下:
#inluce <stdio.h>
int power(int k, int n)
{
while (n > 0)
{
return k * power(k,n - 1);
}
}
int main()
{
int n = 0;
int k = 0;
scanf("%d%d", &k, &n);
int ret = power(k,n);
printf("%d\n", ret);
return 0;
}
运行结果: