你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

递归函数的构建

2022/1/2 8:43:06

我刚看完关于递归的视频,老师留下两道作业。

1.用递归函数解决,汉诺塔问题。

2.一只青蛙,每次只能跳1步或2步,构造递归函数求到第n个台阶有多少种跳法。

这可让我犯难,不过老师讲过斐波那契数列,这两题和他应有相同之处。于是,我就利用数学上的函数关系式表明结果之间的关系式。

对于第一题,设盘数为n,要移f(n)次,列出次数,

nf(n)
11
23
37
415
......

观察知,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里的库函数
}

​

同理,对于第二题

nf(n)
11
22
33
45
58
......

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;
}

大佬们对递归有什么更好的见解,欢迎在下方评论。