斐波那契(Fibonacci)数列,青蛙跳台阶及汉诺塔问题

斐波那契数列.

斐波那契数列指的是: 1, 1, 2, 3, 5, 8, 13......这样的数列.

以下是两种实现实现斐波那契数列的方法.

递归实现:

#include <stdio.h>
#include <stdlib.h>
int fib(int n)
{
	if (n <= 2)
	{
		return 1;
	}
	else
		return fib(n - 1) + fib(n - 2);
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	printf("%d",fib(n));
	return 0;
}

非递归实现:

#include <stdio.h>
#include <stdlib.h>
int fib2 (int n)
{
	int a = 1;
	int b = 1;
	int c = 1;
	while (n>2)
	{
		n--;
		c = a + b;
		a = b;
		b = c;
		
	}
	return c;

}
int main()
{
	int n = 0;
	scanf("%d", &n);
	printf("%d", fib2(n));
	return 0;
}

 

青蛙跳台阶问题:

一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法

当n=1  有1种跳法,当n=2 有2种跳法,当 n=3 有3种跳法>>>>所以台阶数为n时 有fib(n-1)+fib(n-2)种跳法

      递归版实现

#include <stdio.h>
#include <stdlib.h>
int fib(int n)
{
	if (n <= 0)
	{
		return 0;
	}
	else if (n == 1)
	{
		return 1;
	}
	else if (n == 2)
	{
		return 2;
	}
	else
		return fib(n - 1) + fib(n - 2);
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	printf("%d", fib(n));
	return 0;
}

非递归版实现

#include <stdio.h>
#include <stdlib.h>
int fib(int n)
{
	int f1 = 1;
	int f2 = 2;
	int f3 = 0;
	if (n <= 2)
	{
		return n;
	}
	while (n > 2)
	{
		n--;
		f3 = f2 + f1;
		f1 = f2;
		f2 = f3;
	}
	return f3;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	printf("%d", fib(n));
	return 0;
}

变态版:

一只青蛙一次可以跳上1级台阶,也可以跳上2 级……它也可以跳上n 级,此时该青蛙跳上一个n级的台阶总共有多少种跳法?

当n=1时,有1种跳法,当n=2,时有2种跳法, 当 n=3时,有4种跳法;

当 n=4时, 先跳1节还有 fib(4-1)种跳法;先跳2节还有fib(4-2)种跳法;先跳3节还有fib(4-3)种跳法;先跳4节还有fib(4-4)种跳法

当n=n时, 有fib(n)=fib(n-1)+fib(n-2)+fib(n-3)+.........+fib(n-n)种跳法 当n=n-1时 有fib(n-1)=fib(n-2)+fib(n-2)

+.......+fib((n-1)-(n-1))种.

所以可以推出当n>=2时,fib(n)=2fib(n-1)

#include <stdio.h>
#include <stdlib.h>
int fib(int n)
{
	if (n<2)
	{
		return n;
	}
	else
	{
		return 2 * fib(n - 1);
	}
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	printf("%d", fib(n));
	return 0;
}

汉诺塔问题:

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘.

 

现在,我们规定圆盘可以从一个柱子任意移到另一个柱子上。假设有N个圆盘,我们的目标是:将N个圆盘从第一个柱子移到第三个柱子。那么可以把问题分解为:
①Hanota(n - 1, A, C, B),即将A棒上面的n-1个盘移到B棒,借助C棒。
②move(A, C),即将在A棒上的一个盘移到C棒。
③Hanota(n - 1, B, A, C),即将B棒上面的n-1个盘移到C棒,借助A棒。

#include <stdio.h>
#include <stdlib.h>
void Move(char pos1, char pos2)
{
	printf("%c->%c ", pos1, pos2);
}
/*n :代表盘子个数 
pos1:开始位置  
pos2: 中间位置  
pos3:结束位置 */
void Hanota(int n, char pos1, char pos2, char pos3)
{
	//终止条件
	//递归调用
	if (n == 1)
	{
		Move(pos1, pos3);
	}
	else
	{
		Hanota(n - 1, pos1, pos3, pos2);
		Move(pos1, pos3) ;
		Hanota(n - 1, pos2, pos1, pos3);
	}
	printf("\n");
}
int main()
{
	//Hanota(1, 'A', 'B', 'C');
	//Hanota(2, 'A', 'B', 'C');
	Hanota(3, 'A', 'B', 'C');
	return 0;
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值