前言:在C语言函数这一章节中有一个重要且难以理解的知识点——”递归“,今天分享和讲解几道练习题来帮助大家理解理解。
一.什么是递归?
在C语言中这样定义:递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
简单点来说就是:函数自己调用自己
递归所要满足的条件:
(1) 存在限制条件,当满足这个限制条件的时候,递归便不再继续。
(2) 每次递归调用之后越来越接近这个限制条件。
函数递归时要满足这两个条件,要不然会造成死递归导致栈溢出
二.实例讲解
(1) 最简单的递归——main函数自己调用自己
int main() { printf("hehe\n"); main(); return 0; }
由于没有限制条件没次进入main函数都会先打印”hehe“,然后再次调用函数循环下去,最终死递归。
当我们了解用简单的调用main函数递归时让我们一边练习一边讲解开始深入学习递归吧
(2) 接受一个整型值(无符号),按照顺序打印它的每一位。
例如:
输入:1234,输出 1 2 3 4
#include<stdio.h> void print(int n) { if (n > 9) { print(n / 10); } printf("%d ", n % 10); } int main() { int n = 0; scanf("%d", &n); print(n); return 0; }
解析:黑色的笔画为再限制条件下函数的调用红色的为满足条件后每个函数的返回
(2) 求一个数的逆序数
例如:
输入:1234
输出:4321
#include<stdio.h> void print(int n) { if (n > 0) { printf("%d ", n % 10); } print(n/10); } int main() { unsigned int n = 0; scanf("%d", &n); print(n); return 0; }
解析:
(3) 使用递归求n的阶乘
例入:
输入:3
输出:6(即1*2*3)
#include<stdio.h> int Jie(int n) { if (n <= 1) { return 1; } else { return n * Jie(n - 1); } } int main() { int n = 0; scanf("%d", &n); int ret=Jie(n); printf("%d", ret); return 0; }
解析:
(4) 使用递归求字符串长度
#include<stdio.h> int my_strlen(char* s) { if (*s == '\0') { return 0; } else { return 1 + my_strlen(s + 1); } } int main() { char arr[] = "abc"; int len=my_strlen(arr); printf("%d ", len); return 0; }
解析:
总结:函数递归的一点心得 不知道大家有没有发现解决函数递归的问题我们多数要从最后入手就像n的阶乘,从最后的第n项入手,可以理解为n乘n-1的阶乘,又像是求字符串的长度,我们知道字符串的结尾为'\0',我们只需要判断是不是'\0'就行了。希望大家可以思考一下我的心得。