C语言学习
前言
在上一篇内容中我们知道,在调用一个函数并执行该函数的过程中,可以又调用另一个函数,那函数可以再执行过程中自己调用自己吗?
一、函数递归是什么?
程序调用自身的编程技巧称为递归( recursion)。
- 递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法。
- 它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
- 递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
二、递归的两个必要条件
- 存在限制条件,当满足这个限制条件的时候,递归便不再继续。
- 每次递归调用之后越来越接近这个限制条件。
三、函数递归实例
接受一个整型值(无符号),按照顺序打印它的每一位。
例如: 输入:1234,输出 1 2 3 4
代码示例:
#include <stdio.h>
void print(unsigned int x)
{
if (x > 9)
{
print(x / 10);
}
printf("%d ", x % 10);
}
int main()
{
unsigned int num = 0;
scanf("%u", &num);
print(num);
return 0;
}
1234
1 2 3 4
编程思路:
1234这个四位数最好打印的是它的最末位,
可以用取余的方法得到末位数字:1234 % 10 = 4 ;
那可以将末尾数字去处:1234 / 10 = 123 ;
再得到下一个末尾数字:123 % 10 = 3 ;
于是可以设计一个循环,依次得到末位数字:
#include <stdio.h>
int main()
{
unsigned int num = 0;
scanf("%u", &num);
while (num)
{
printf("%d ", num % 10);
num = num / 10;
}
}
运行结果:
1234
4 3 2 1
可是如何才能按题目要求的顺序实现打印结果呢?
可以试试函数递归的方法:
设计一个函数,它可以实现先一个一个去掉最后一位,并且可以把先去掉的最后一位数字最后一个打印。
可以先来想函数”递“的思路:
- function(1234) :向函数中传入1234;
- function(123) 4 :函数把最末尾4,剥离出来;123再进入函数。
- function(12) 3 4 :函数把最末尾3,剥离出来;12再进入函数。
- function(1) 2 3 4 :函数把最末尾2,剥离出来;1再进入函数。
- 1 2 3 4 :函数把所有数都剥离出来;
再来想函数”归“的思路:
- function(1) 中printf(" 1 ") :1进入函数时打印出1
- function(12) 中printf(" 2 ") :12进入函数时打印出末位2
- function(123) 中printf(" 3 ") :123进入函数时打印出末位3
- function(1234) 中printf(" 4 ") :1234进入函数时打印出末位4
- 最后打印结果显示为 1 2 3 4
void print(unsigned int x)
{
if (x > 9)
{
print(x / 10);
}
printf("%d ", x % 10);
}
有了思路再去设计函数时还必须要考虑到函数递归的两个必要条件:
- 存在限制条件,当满足这个限制条件的时候,递归便不再继续。if (x > 9)
- 每次递归调用之后越来越接近这个限制条件。print(x / 10);
这样一个递归函数就设计好了!
总结
以上就是今天要讲的内容,本文仅仅简单介绍了函数递归,而如何能使用函数递归来实现一些编程问题,将在下一篇文章里重点介绍几个编程题示例,希望可以帮助大家去使用递归的方法解决问题。