C语言经典题目:递归,迭代法解决斐波那契数列,,猴子吃桃问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_36027342/article/details/86101442

1.猴子吃桃:某天摘若干个,当天吃掉一半,又多吃一个,重复到第8天时只剩下一个桃子了

分析:

设f(x)为每天还剩的桃子个数;题目中说到第8天时只剩下一个,则f(8)=1,同时从题目中可知猴子每天吃掉一半,又多吃了一个,因此f(8)=f(7)/2-1;据此可写出函数:f(x)=f(x-1)/2-1;f(x)=2*f(x+1)+1,f(8)=1

(1).利用递归,可推出公式f(n)=2*f(n+1)+1,f(8)=1

int tao(int n) {
	//f(n)=2*f(n+1)+1,f(8)=1;
	if (n == 8)
		return 1;
	return 2 * (tao(n + 1) + 1);
}

打印结果:

void peach() {
	//打印结果
	////猴子吃桃,某天摘若干个,当天吃掉一半,又多吃一个重复到第8天时只剩下一个桃子了
	//Xn=(Xn-1)/2-1;Xn=2*((Xn+1)+1),X8=1;
	int tao(int n);//声明
	int n;
	for (n = 1; n <= 8; n++)
	{
		printf("第%d天有%d个桃子\n", n, tao(n));
	}

}

(2).利用迭代法,循环解决

void peach2() {
	//猴子吃桃,某天摘若干个,当天吃掉一半,又多吃一个重复到第8天时只剩下一个桃子了
		//Xn=(Xn-1)/2-1;Xn=2*((Xn+1)+1),X8=1;
	int tao, n;
	tao = 1;
	for (n = 7; n >= 1; n--)
	{
		tao = (tao + 1) * 2;

	}
	printf("tao(1)=%d\n", tao);

}

2.斐波那契数列,第一第二项为1,从第三项起,是前两项的值之和.

(1).利用递归,可推出f(n)=f(n-1)+f(n-2)

int fib(int n) {
	//递推公式,f(n)=f(n-1)+f(n-2);
	if (n = 2 || n == 1)
		return 1;
	return fib(n - 1) + fib(n - 2);
}

打印结果:

void printfib(int n) {
	//斐波那契数列,第一第二项为1,从第三项起,是前两项的值之和.
	//递推公式,f(n)=f(n-1)+f(n-2);
	int fib(int n);//声明
	int i;
	for (i = 1; i <= n; i++)
	{
		printf("%d%c", fib(i), i % 5 == 0 ? '\n' : '\t');
	}
}

(2).利用迭代循环

void printfib2(int n) {
	int i, f1 = 1, f2 = 1, f3;
	printf("%d\t%d\t", f1, f2);
	for (i = 3; i <= n; i++)
	{
		f3 = f1 + f2;
		printf("%d\t", f3);
		if (i % 5 == 0)
			printf("\n");
		f1 = f2;
		f2 = f3;
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_36027342/article/details/86101442