斐波拉契数列和汉诺塔问题
2016-03-11 09:27
375 查看
一. 斐波拉契数列
在做编程题目的时候经常会遇到“斐波那契数列”相关的题目,尤其在做OJ中。下面说一些方法:
(一)递归
递归是最慢的会发生重复计算,时间复杂度成指数级。
代码实现:
(二)循环
利用临时变量来保存中间的计算过程,加快运算。
二.汉诺塔问题
汉诺塔的递归算法与解析
从左到右 A B C 柱 大盘子在下, 小盘子在上, 借助B柱将所有盘子从A柱移动到C柱, 期间只有一个原则: 大盘子只能在小盘子的下面。
代码实现:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DataStructure
{
class HanoiTower
{
public void MoveDisk(int DiskQuantity,string PositionA, string PositionB, string PositionC)
{
// If there's only one disk, then end.
if (DiskQuantity == 1)
{
Console.WriteLine("Move disk from position {0} to {1}.", PositionA, PositionC);
// Must return
return;
}
else
{
// Step 1 - Change B to C (A --> B)
MoveDisk(DiskQuantity - 1, PositionA,PositionC,PositionB);
// Step 2 - No changes (A --> C)
MoveDisk(1, PositionA, PositionB, PositionC);
// Step 3 - Change B to A (A --> C)
MoveDisk(DiskQuantity - 1, PositionB, PositionA, PositionC);
}
}
static void Main(string[] args)
{
HanoiTower hanoi = new HanoiTower();
Console.WriteLine("Please input Disk Quantity:");
int DiskQuantity = Convert.ToInt32(Console.ReadLine());
hanoi.MoveDisk(DiskQuantity, "A", "B", "C");
Console.ReadKey();
}
}
}
在做编程题目的时候经常会遇到“斐波那契数列”相关的题目,尤其在做OJ中。下面说一些方法:
(一)递归
递归是最慢的会发生重复计算,时间复杂度成指数级。
代码实现:
long long fac(int n) { if(n==1) return 1; else if(n==2) return 2; else return fac(n-1)+fac(n-2); }
(二)循环
利用临时变量来保存中间的计算过程,加快运算。
long long fac(int n) { long long a=1,b=2,c; if(n==1) return 1; else if(n==2) return 2; else { for(int i=3;i<=n;i++) { c=a+b; a=b; b=c; } } return b; }
二.汉诺塔问题
汉诺塔的递归算法与解析
从左到右 A B C 柱 大盘子在下, 小盘子在上, 借助B柱将所有盘子从A柱移动到C柱, 期间只有一个原则: 大盘子只能在小盘子的下面。
代码实现:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DataStructure
{
class HanoiTower
{
public void MoveDisk(int DiskQuantity,string PositionA, string PositionB, string PositionC)
{
// If there's only one disk, then end.
if (DiskQuantity == 1)
{
Console.WriteLine("Move disk from position {0} to {1}.", PositionA, PositionC);
// Must return
return;
}
else
{
// Step 1 - Change B to C (A --> B)
MoveDisk(DiskQuantity - 1, PositionA,PositionC,PositionB);
// Step 2 - No changes (A --> C)
MoveDisk(1, PositionA, PositionB, PositionC);
// Step 3 - Change B to A (A --> C)
MoveDisk(DiskQuantity - 1, PositionB, PositionA, PositionC);
}
}
static void Main(string[] args)
{
HanoiTower hanoi = new HanoiTower();
Console.WriteLine("Please input Disk Quantity:");
int DiskQuantity = Convert.ToInt32(Console.ReadLine());
hanoi.MoveDisk(DiskQuantity, "A", "B", "C");
Console.ReadKey();
}
}
}
相关文章推荐
- 希尔排序--Java实现
- 需要这样一个记事本-17 VS 2010 远程调试
- 利用Python进行数据分析---ch02《MovieLens 1M数据集(下)》读书笔记
- Activity overridePendingTransition动画效果
- SQL Server 基础:Case两种用法
- 【bzoj2733】【HNOI2012】【永无乡】【treap+启发式合并】
- C++中stringstream常见用法
- MySQL 安装
- Android Touch事件传递机制解析
- Windows Embedded Standard 7 快速入门指南 4 of 4
- C语言的代码内存布局详解
- WebView 加载网页和java 与js交互
- 个人常用vim操作以及插件
- C语言逗号运算符
- 蚂蚁
- 【转】如图,win7登陆界面,键盘失灵,没办法登陆。求解!如何在这个界面打开个鼠标可以点的软键盘
- bootrom启动流程【转】
- 下一步目标
- codeforces 245H . Queries for Number of Palindromes 区间dp
- 设计模式_原型模式