一、基础概念
递归:在调用一个函数的过程中又出现直接或者间接地调用该函数自己本身,称为函数的递归调用
二、习题举例
(其中包含三个习题) 1.题目:有5个学生坐在一起。问第5个学生多少岁?他说比第4个学生大2岁。问第4个学生多少岁?他说比第3个学生大2岁。问第3个学生多少岁?他说比第2个学生大2岁。问第2个学生多少岁?他说比第1个学生大2岁。最后问第1个学生多少岁,他说自己10岁。问,第5个学生多大 方法一:不使用递归
int Age(int n)
{
int tmp = 10;
for (int i = 1; i < n; i++)
{
tmp += 2;
}
return tmp;
}
int main()
{
for (int i = 1; i <= 5; i++)
{
printf("第%d个学生的岁数是%d岁\n",i, Age(i));
}
return 0;
}
运行结果如下图: 方法二:使用递归
int Age(int n)
{
int tmp;
if(n == 1)
{
tmp = 10;
}
else
{
tmp = Age(n - 1) + 2;
}
return tmp;
}
int main()
{
printf("第5个学生岁数是%d岁\n",Age(5));
return 0;
}
运行结果如下图: 2.题目:求n的阶乘(使用5的阶乘来看结果的正确性) 方法一:非递归
int Fac(int n)
{
int sum = 1;
for (int i = 1; i <= n; i++)
{
sum *= i;
}
return sum;
}
int main()
{
printf("%d\n", Fac(5));
return 0;
}
运行结果如下图: 方法二:递归
int Fac(int n)
{
int sum;
if (n == 0 || n == 1)
{
sum = 1;
}
else
{
sum =n*Fac(n - 1);
}
return sum;
}
int main()
{
printf("%d\n", Fac(5));
return 0;
}
运行结果如下图: 3.题目:猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,就只剩一个桃子了。求第1天共摘多少个桃子。
int Peach(int n)
{
if (n == 1)
{
return 1;
}
else
{
return (Peach(n - 1) + 1) * 2;
}
}
int main()
{
printf("%d\n", Peach(10));
return 0;
}
运行结果如下图:
三、
虽然在学习c语言的过程中学习了递归,但是就目前来说递归的方法使用时所占用的栈帧过多,不推荐多次使用 尤其是在斐波那契数列中,关于for循环和递归两者运行程序时所占用的时间会随着数值的增大而增大。
|