我刚看完关于递归的视频,老师留下两道作业。
1.用递归函数解决,汉诺塔问题。
2.一只青蛙,每次只能跳1步或2步,构造递归函数求到第n个台阶有多少种跳法。
这可让我犯难,不过老师讲过斐波那契数列,这两题和他应有相同之处。于是,我就利用数学上的函数关系式表明结果之间的关系式。
对于第一题,设盘数为n,要移f(n)次,列出次数,
n | f(n) |
1 | 1 |
2 | 3 |
3 | 7 |
4 | 15 |
... | ... |
观察知,f(n)=2^(n-1)+f(n-1),用递归程序写就有
int move(int x)
{
if (x <= 0)
return 0;
else
return move(x-1)+pow(2.0,x-1);//这里用了math.h里的库函数
}
同理,对于第二题
n | f(n) |
1 | 1 |
2 | 2 |
3 | 3 |
4 | 5 |
5 | 8 |
... | ... |
f(n)=f(n-1)+f(n-2),这里的f(2)=f(1)+f(0)=2,f(1)=f(0)+f(-1),当0<=n<=1时,f(n)=1,n<0时,f(n)=0.
int jump(int x)
{
if (x > 1)
return (jump(x - 1) + jump(x - 2));
else if (x<=1&&x>=0)
return 1;
else
return 0;
}
这两题就完成了,写成完整代码
int my_str(char* str)
{
if (*str != '\0')
return 1 + my_str(str + 1);//递归求字符串长度
else
return 0;
}
int strl(char* s)
{
int count = 0;
while (*s != '\0')
{
count++;
s++;
}
return count;//循环求字符串长度
}
int mul(int x)
{
if (x <= 1)
return 1;
else
return (x)*mul(x-1);//求阶乘
}
int move(int x)
{
if (x <= 0)
return 0;
else
return move(x-1)+pow(2.0,x-1);
}
int jump(int x)
{
if (x > 1)
return (jump(x - 1) + jump(x - 2));
else if (x<=1&&x>=0)
return 1;
else
return 0;
}
int main()
{
int n = 5;//自己设置
char arr[] = "qwerasdfzxcv";
printf("%d\n%d\n%d\n%d\n%d", my_str(arr),strl(arr),mul(n),move(n),jump(n));
return 0;
}
大佬们对递归有什么更好的见解,欢迎在下方评论。