递归:在调用一个函数的过程中又出现直接或间接地调用该函数自己本身,称为函数的递归调用。
例7.1 有5个学生坐在一起
◆问第5个学生多少岁?他说比第4个学生大2岁
◆问第4个学生岁数,他说比第3个学生大2岁
◆问第3个学生,又说比第2个学生大2岁
◆问第2个学生,说比第1个学生大2岁
◆最后问第1个学生,他说是10岁
◆请问第5个学生多大?
第一种我们先用for循环来写:
1. 理清其中的关系,由题目可知: 第一个学生10岁,那么第二个学生就是12岁,以此类推第五个学生就是18岁。
#include <stdio.h>
int Age1(int n)
{
int tmp = 10; //第一个学生的年龄为10岁
for(int i=1; i<n; i++) //若n=5,说明要求第五个学生的年龄,那就是tmp依次加2,最后是18,若是n=1这里会出现问题吗,实则是不会的,因为当n=1时for循环是没有执行的,所以tmp 还是10.
{
tmp += 2;
}
return tmp; //返回所求的年龄
}
int main()
{
for (int i = 1; i <= 5; i++)
{
printf("%d\n", Age1(i)); //打印每个人的年龄
}
return 0;
}
调试结果为:
第二种我们用递归法来写:
其中的规律为:
Age(n):第n个学生的年龄 == Age(n-1)+2
Age(n-1):第n-1个学生的年龄==Age(n-1)
Age(1):第1个学生的年龄==10 这是递归的停步准则,如果n==1,tmp=10,然后把10依次带入每一个Age( )中,求出最后要的年龄。
#include<stdio.h>
int Age(int n)
{
int tmp;
if(n == 1)
{
tmp = 10;
}
else
{
tmp = Age(n-1)+2;
}
return tmp;
}
int main()
{
for (int i = 1; i <= 5; i++)
{
printf("%d\n", Age(i));
}
return 0;
}
调试结果为:
最不适用于用递归函数的经典题目:斐波那契数列