Hi,您好,欢迎来到西安盛图软件科技有限公司!

C语言知识点丨递归函数

发布时间:2023-11-17 16:21:48

01
基础概念


1.函数递归的定义

一个函数在它的函数体内调用它自身称为递归调用,这种函数称为递归函数。递归做为一种算法在程序设计语言中广泛应用。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。


2.函数递归的优缺点

优点:

函数递归只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。

缺点:

①如果函数递归使用不恰当,会导致栈溢出,因为每一次函数调用都会在栈区上申请内存空间。

②每一次函数递归(函数调用)都会在函数栈帧上开辟一块空间,所谓的压栈。这样会大大降低我们代码的执行效率


3.函数递归的两个必要条件

存在限制条件,当满足这个限制条件的时候,递归便不再继续。

每次递归调用之后越来越接近这个限制条件。


02
入门级函数递归例题


1.函数递归之死循环

在了解了函数递归的基础概念后,来看看这段代码,它的运行结果是什么呢?

image.png

程序最终会崩溃。因为每一次函数调用都会在栈上开辟一块空间,这种死循环的代码会一直开辟空间,直至栈溢出。


2.输入输出1234

题目描述

接受一个整型值(无符号),按照顺序打印它的每一位。例如:

输入:1234,输出1234。

解题思路

这种输入输出数字的题,我们一定要想到取模和取余的方法,并且要有限制条件,每次函数递归后,都会越来越接近这个值。

所以先函数递推1234%10=4,123%10=3,12%10=2,1%10=1,给定限制条件n>9,直到n=1,打印出最后值“1”,最后函数回归打印出1234。

设n为1234

print(1234/10) + 1234%10 (=4)

print(123/10) + 123%10(=3)

print(12/10) + 12%10(=2)

当n最后为1时,不满足我们给定的限制条件n>9时,即打印1%10(=1)

代码如下

image.png


03
函数递归典型例题


1.n阶乘

题目描述

用递归的方法求n的阶乘(不考虑溢出)。例如:

输入:4,输出24。

解题思路

n的阶乘为1*2*3*4*…*(n-1)*n,我们可以先用递推的思想,先算出n*(n-1)的值,再用n*(n-1)的值乘以(n-2),这样依次乘下去,以n=1为限制条件,返回1。然后再用回归思想,返回回去,及可得到n的阶乘。

JC(n)

n * JC(n-1)

n * JC(n-1) * JC(n-2)

n * JC(n-1) * JC(n-2) * JC(n-3)

n * JC(n-1) * JC(n-2) * JC(n-3)…JC(1)

当满足我们的限制条件n=1时,返回1,然后回归

代码如下

image.png


2.strlen函数的模拟实现

题目描述

用递归的方法模拟实现strlen函数。例如:

输入:abc,输出3。

解题思路

strlen遇到’\0’才会停止,所以我们以’\0’为限制条件,我们每调用一次my_strlen函数,次数就加一,直到遇到’\0’停止。

my_strlen(abc)--------------这里是指针在移动

1+my_strlen(bc)

1+my_strlen(b)

1+my_strlen(‘\0’)

当满足我们的**限制条件’\0’**时,返回0,然后回归。

代码如下

image.png


3.字符串逆序

上一篇:超详解答:C语言|字符数组和字符串
下一篇:什么是编程语言