定义:
递归就是一个函数在它的函数体内调用它自身。执行递归函数将反复调用其自身,每调用一次就进入新的一层。递归函数必须有结束条件。
当函数在一直递推,直到遇到结束条件后返回。
所以递归要有两个要素,结束条件与递推关系。
递归有两个基本要素:
(1)边界条件:确定递归到何时终止,也称为递归出口。
(2)递归模式:大问题是如何分解为小问题的,也称为递归体。递归函数只有具备了这两个要素,才能在有限次计算后得出结果 。
例题1:
接受一个无符号整型值,然后将其每一位分别打印出来。(输入“1234”)
提示:可取该整型值10的余数,再将整型值除以10取整型,再重复该操作,即可分别打印。
答案如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void fac(int n)
{
if (n > 9)
{
fac(n / 10);
}
printf("%d ", n % 10);
}
int main()
{
int n = 0;
scanf("%d", &n);
fac( n);
return 0;
}
结果为:
那这段代码是怎么递归的呢?
该代码运行思路如图所示:(绿色代表递进,红色代表回归)
例题2:
编写一个不创建临时变量的函数,实现可求某字符串长度。(输入“big”)
方法1(不用递归,创建临时变量)
提示:
在写此题前,我们得先了解一些基本概念。
其一:数组中每个连续字符,其地址也是连续相连的。
其二:数组中是有'\0'作为结束标志的。(例如 arr [] ='big',其数组中实际为'b i g \0')
其三:当数组传给函数时,并不是将整个数组所调用,而是调用其数组第一个字符的地址,因此得使用传址调用。(如需可翻看我第一篇博客了解传值调用和传址调用的区别)
在了解之后基本概念后,我们可想到设计一个函数从数组第一个字符的地址,利用变量“count”开始统计,统计完第一个字符后“count++”,再在原地址上加一得下一个字符的地址,再统计该字符变量count++,直至遇到“\0”停止统计,变量count 的值即为其字符串长度。
答案如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int my_strlen(char* str)
{
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
char arr[] = "big";
int len = my_strlen(arr);
printf("len=%d\n", len);
return 0;
}
结果为:
方法2(使用递归,不创建临时变量)
提示:我们使用递归函数,当遇到的字符不为“\0”时返回值便加一,同时地址加一,返回其函数再以此下去,直到遇到“\0”,便停止递归。
答案如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int my_strlen(char* str)
{
if (*str != '\0')
{
return 1 + my_strlen(str + 1);
}
else
{
return 0;
}
}
int main()
{
char arr[] = "big";
int len = my_strlen(arr);
printf("len=%d\n", len);
return 0;
}
结果为:
图解如下:(绿色代表递进,红色代表回归)
以上便是关于函数递归的内容了,喜欢可点个赞或收藏哦!
谢谢浏览!(如有问题,请各位大神即使指出,我会及时纠正!)