您的位置:首页 > 其它

斐波拉契数列和汉诺塔问题

2016-03-11 09:27 375 查看
一. 斐波拉契数列

       在做编程题目的时候经常会遇到“斐波那契数列”相关的题目,尤其在做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();
}
}
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: