什么是递归?
概念:程序调用自身的编程技巧称为递归,递归作为一种算法在程序设计语言中广泛要用,一个过程或函数在其定义或说明有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量,递归的主要思考方式在于:把大事化小
递归的两个必要条件
存在限制条件,当满足这个限制条件的时候,递归便不再继续
每次递归调用之后越来越接近这个限制条件
内存中可分为三个区域(栈区、堆区、静态区),如图所示:
我们简单的来看一个递归语句
#include <stdio.h>
int main() {
printf("haha\n");
main();
return 0;
}
我们运行这个代码,就会无限打印haha,但是你会发现 唉?怎么停止了,又给你报了一个错误,就是栈溢出。什么是栈溢出?当我们程序走起来的时候,我们main函数向栈区申请空间,main函数一直调用自己,每次向栈区申请空间,等到空间被用完之后,就会报错,栈溢出。
例题一:输入一个整数,要求一个一个字符输出
例如输入1234 输出1 2 3 4
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void printf(int n) {
//printf(123) 4
//printf(12) 3 4
//printf(1) 2 3 4
//只有一位数了不需要拆分了
//n>9两位及两位以上
if (n > 9) {
printf(n / 10);
}
printf("%d", n % 10);
}
int main() {
unsigned int num = 0;
scanf("%d ", &num);
printf(num);
return 0;
}
例题二
编写代码:求字符串长度。
#include <string.h>
int main() {
char arr[] = "bit";
int a =strlen (arr);
printf("%d ", a);
}
自己写一个strlen函数
int my_strlen(char* a) {
int count = 0;
while (*a!='\0') {
count++;
a++;
}
return count;
}
int main() {
char arr[] = "bit";
int a =my_strlen (arr);//arrs是数组,数组传参,传过去的不是整个数组,而是第一元素地址。
printf("%d ", a);
}
利用递归来求字符串长度
int my_strlen(char* a) {
if (*a != '\0') {
return 1 + my_strlen(a + 1);
}
else {
return 0;
}
}
int main() {
char arr[] = "bit";
int a= my_strlen(arr);
printf("%d ", a);
return 0;
}