今天是在b站跟着bit鹏哥学习C语言的第15天,今天将学习了函数的最后一小节递归;以及函数调用,递归的练习题;
一,函数递归
什么是递归?、
简单来说就是函数自己调用自己;
程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的主要思考方式在于:把大事化小
递归的两个必要条件
1,存在限制条件,当满足这个限制条件的时候,递归便不再继续。
2,每次递归调用之后越来越接近这个限制条件。
就简单的递归(虽然是递归但是是一种错误的写法)
int main() { printf("haha\n"); main(); return 0; }
这样会造成Stack overflow(栈溢出)
什么是栈溢出呢?
我们把内存分为三个部分:栈区,堆区,静态区;
栈区里面存放局部变量和函数形参;堆区里面是内存分配;静态区里面放全局变量和静态变量;
函数每一次调用都会在栈区开辟一块新的空间;当函数调用结束是会清空开辟的空间;栈区是有限的;所以会形成上面的Stack overflow(栈溢出);
二,函数递归练习
接受一个整形,按照顺序打印它的每一位。例如:输入1234,输出1 2 3 4.
void print(int n) { if (n > 9) { print(n/10); } printf("%d ", n % 10); } #include <stdio.h> int main() { int num = 0; scanf("%d", &num); print(num); return 0; }
求字符串长度 例如:bit的长度为3
int my_strlen(char* str) { if (*str != '\0') { return 1 + my_strlen(str + 1); } else return 0; } #include <stdio.h> int main() { char arr[] = "bit"; printf("%d \n", my_strlen(arr)); return 0; }
打印n的阶乘
int f(int n) { if (n <= 1) { return 1; } else return n* f(n-1); } #include <stdio.h> int main() { int n = 0; scanf("%d", &n); printf("%d ", f(n)); return 0; }