一、函数递归
程序调用自身的编程技巧称为递归(recurion);递归作为一种算法在程序设计语言中广泛应用.一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似但规模较小的问题来求解,递归策略只需少量的程序就可以描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
递归的主要思考方式在于:把大事化小
void print(unsigned int n) { if (n > 9) { print(n / 10); } printf("%d ", n % 10); } int main() { unsigned int num = 0; scanf("%u", &num); //递归 - 函数自己调用自己 print(num);//print函数可以打印参数部分数字的每一位 return 0; }
二、递归的必要条件
1.存在限制条件,当满足这个条件的时候,递归不在继续;
2.每次递归调用之后越来越接近这个限制条件。
这是必要条件,但是不充分!如果递归太深,会导致栈溢出,程序就不能正常运行。
三、练习
//编写函数,不创建临时变量,求字符串的长度 int my_strlen(char* str) { if (*str != '\0') return 1 + my_strlen(str + 1); else return 0; } int main() { char arr[] = "dream"; printf("%d\n", strlen(arr)); //模拟实现一个strlen函数 printf("%d\n", my_strlen(arr)); return 0; }
//求n的阶乘 int Fac(int x) { if (x <= 1) return 1; else return x * Fac(x - 1); } int main() { int n = 0; printf("请输入一个数:"); scanf("%d", &n); int ret = Fac(n); printf("这个数的阶乘是:%d\n", ret); return 0; }
//求第n个斐波那契数的值 int Fib(int x) { if (x <= 2) return 1; else return Fib(x - 1) + Fib(x - 2); } int main() { int n = 0; printf("请输入一个数:"); scanf("%d", &n); int ret = Fib(n); printf("第%d个斐波那契数的值是:%d", n, ret); return 0; }