目录
什么是函数的递归
函数递归的必要条件
函数递归的练习
下面我们通过几个具体的问题来具体的了解函数的递归。
求字符串长度
问题
用函数递归的方式求字符串长度
分析
首先我们知道字符串结束的标志是‘\0’,所以当字符为\0时就可以当作我们的限制此时直接可以返回1,当字符不为\0时我们返回1+前一个字符(再次调用此函数)。
代码
int Strlen1(char* arr)
{
if (*arr == '\0')
return 0;
else
return 1 + Strlen1(arr + 1);
}
int main()
{
char str[] = "abcdethrhr";
printf("%d", Strlen1(str));
return 0;
}
运行结果
通过递归的方法打印数字
问题
输入一串数字例如1234,然后通过函数递归的方式从左向右1 2 3 4 的打印出来。
分析
我们可以通过除10取余的方式依次取出4 3 2 1,但是题目要求的是1 2 3 4的打印出来,我们可以这样先把1234分解为
123 4,然后将123分解为
12 3 4,再将12分解为
1 2 3 4
求n的阶乘
代码
int print(int x)
{
if (x >= 10)
{
print(x / 10);
}
printf("%d ",x%10);
}
int main()
{
unsigned int num = 1234;
scanf("%d", &num);
print(num);
return 0;
}
运行结果
输出前n项斐波那契数列
问题
用函数递归的方式实现输出斐波那契数列的前n项
分析
我们知道斐波那契数列的第1项和第2项都是1,后面的每一项都是前两项之和,那么我们就可以设置它的限制为n==1||n==2(n为项数)此时直接返回1就行了,当n>2时我们可以直接返回它前两项之和,求前两项的时候通过递归调用自身就可以了。
代码
int Fio(int n)
{
if (n == 1 || n == 2)
return 1;
else
return Fio(n - 1) + Fio(n - 2);
}
int main()
{
int num = 0;
scanf("%d", &num);
for (int i = 1; i <= num; i++)
{
printf("%d ", Fio(i));
}
return 0;
}
运行结果
汉诺塔问题
问题
实现如图效果
A B C
分析
当n=1时我们直接把A上的盘子移动到C上。
当n>1时我们先把(n-1)A上的盘子移到B(A->B),然后A->C,再将(n-1)B上的盘子移到C上(B->C)。
代码
void move1(char x, char y)
{
printf("%c->%c\n", x, y);
}
void Hanio(int n,char x,char y,char z)
{
if (n == 1)
move1(x, z);
else
{
Hanio(n - 1, x, z, y);
move1(x, z);
Hanio(n - 1, y, x, z);
}
}
int main()
{
int n = 0;
printf("输入汉诺塔的阶数:");
scanf("%d", &n);
Hanio(n, 'A', 'B', 'C');
return 0;
}
运行结果
青蛙跳台阶问题
问题
一直青蛙一次只能跳一个或者两个台阶,请问跳到n阶共有几种跳发,用函数递归的方法给出结果。
分析
跳到1台阶共1种方法,跳到2台阶共2钟方法,跳到3台阶共3中,4台阶共5种···,我们可以得出规律,跳到n阶的方法数等于跳到n-1阶的方法数加上跳到n-2阶的方法数。
代码
int jump(int x)
{
if (1 == x)
return 1;
else if (2 == x)
return 2;
else
return jump(x - 1) + jump(x - 2);
}
int main()
{
int num = 0,style = 0;
printf("输入阶梯数:\n");
scanf("%d", &num);
style = jump(num);
printf("%d", style);
return 0;
}