2021.11.22 关于函数的递归

定义:

递归就是一个函数在它的函数体内调用它自身。执行递归函数将反复调用其自身,每调用一次就进入新的一层。递归函数必须有结束条件。 

当函数在一直递推,直到遇到结束条件后返回。 

所以递归要有两个要素,结束条件与递推关系。

递归有两个基本要素:

(1)边界条件:确定递归到何时终止,也称为递归出口。

(2)递归模式:大问题是如何分解为小问题的,也称为递归体。递归函数只有具备了这两个要素,才能在有限次计算后得出结果 。

例题1:

接受一个无符号整型值,然后将其每一位分别打印出来。(输入“1234”)

提示:可取该整型值10的余数,再将整型值除以10取整型,再重复该操作,即可分别打印。

答案如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include

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;
}

结果为:

那这段代码是怎么递归的呢?

该代码运行思路如图所示:(绿色代表递进红色代表回归

2021.11.22 关于函数的递归_第1张图片

例题2:

编写一个不创建临时变量的函数,实现可求某字符串长度。(输入“big”)

方法1(不用递归,创建临时变量)

提示:

在写此题前,我们得先了解一些基本概念。

其一:数组中每个连续字符,其地址也是连续相连的。

其二:数组中是有'\0'作为结束标志的。(例如 arr [] ='big',其数组中实际为'b i g \0')

其三:当数组传给函数时,并不是将整个数组所调用,而是调用其数组第一个字符地址,因此得使用传址调用。(如需可翻看我第一篇博客了解传值调用和传址调用的区别)

在了解之后基本概念后,我们可想到设计一个函数从数组第一个字符的地址,利用变量“count”开始统计,统计完第一个字符后“count++”,再在原地址上加一得下一个字符的地址,再统计该字符变量count++,直至遇到“\0”停止统计,变量count 的值即为其字符串长度。

答案如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include

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

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;
}

结果为:

 图解如下:绿色代表递进红色代表回归

2021.11.22 关于函数的递归_第2张图片

以上便是关于函数递归的内容了,喜欢可点个赞或收藏哦!

谢谢浏览!(如有问题,请各位大神即使指出,我会及时纠正!)

你可能感兴趣的:(函数递归,es6,前端,c语言)