递归:递归作为一种算法在程序设计中被广泛使用,一个函数或者过程在其定义或者使用过程中有直接或者简介调用自己的方法就叫做递归。更通俗的理解就是函数自己调用了自己就称为函数递归,递归可以大大减少代码量。
函数递归的思想在于把大事化小,小事化了。接下来让我来看一个十分基础的递归代码:
int main()
{
printf("hehe\n");
main();
return 0;
}
运行结果:无限循环打印hehe
由以上代码引出递归的两个必要条件:1.存在限制条件,满足限制条件递归结束。2.每次递归调用越来越接近这个限制条件。接下来让我们通过实例来进一步理解递归:
输入一个整数,打印整数的每一位:
void print(int n)
{
if (n > 9)
{
print(n / 10);
}
printf("%d ", n % 10);
}
int main()
{
int num = 0;
scanf("%d", &num);
print(num);
return 0;
}
运行结果:
这个题目的基本思想是:使用自创的print函数来打印整数每一位,我们得到最后一位只需要用123%10就可以拿到3,然后顺序一次取模拿到每一位,然后打印。接下来为大家画图方便理解代码。(画图质量比较一般望大家见谅,基本思路清晰即可)
当整数大于9的时候就进行整数除以10的递归,直到小于久,进入printf函数开始打印。如果大家理解了博主还为大家准备了几个相对简单的递归实例并附上代码,小伙伴们可以自己尝试着实现用递归去解决问题。
1.斐波那契数
long long Fac(int n)
{
if (n < 3)
return 1;
return Fac(n - 1) + Fac(n - 2);
}
int main()
{
int n = 0;
scanf("%d", &n);
long long ret = Fac(n);
printf("%d", ret);
return 0;
}
2.
n的k次方
long long Pow(int n, int k)
{
if (k == 0)
return 1;
else
return n * Pow(n, k - 1);
}
int main()
{
int n = 0;
int k = 0;
scanf("%d %d", &n, &k);
long long ret = Pow(n, k);
printf("%d", ret);
return 0;
}
3.
阶乘
int Fact(int n)
{
if (n <= 1)
{
return 1;
}
else
{
return n * Fact(n - 1);
}
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Fact(n);
printf("%d", ret);
return 0;
}
4.
strlen的实现
int my_strlen(char* str)
{
if (*str == '\0')
{
return 0;
}
else
return 1 + my_strlen(1 + str);
}
int main()
{
char arr[] = "abcdegf";
int ret = my_strlen(arr);
printf("%d", ret);
return 0;
}
希望本篇文章能让大家对递归有更深的认识,能够帮助大家学会函数递归。