您的位置:首页 > 其它

递归函数的练习,汉诺塔问题的程序实现(递归)

2016-04-26 19:01 519 查看
1.汉诺塔是由三根杆子A,B,C组成的。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:每次只能移动一个圆盘;大盘不能叠在小盘上面。提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须尊循上述两条规则。问:如何移?最少要移动多少次?汉诺塔是根据一个传说形成的一个问题:

有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:

每次只能移动一个圆盘;

大盘不能叠在小盘上面。

提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须尊循上述两条规则。

问:如何移?最少要移动多少次?



class Program
{
static int i = 1;
static void move(int n, char from, char to) //将编号为n的盘子由from移动到to
{
Console.WriteLine("第{0}步:将{1}号盘子{2}---->{3}\n", i++, n, from, to);
}
static void hanoi(int n, char from, char denpend_on, char to)//将n个盘子由初始塔移动到目标塔(利用借用塔)
{
if (n == 1)
move(1, from, to);//只有一个盘子是直接将初塔上的盘子移动到目的地
else
{
hanoi(n - 1, from, to, denpend_on);//先将初始塔的前n-1个盘子借助目的塔移动到借用塔上
move(n, from, to);              //将剩下的一个盘子移动到目的塔上
hanoi(n - 1, denpend_on, from, to);//最后将借用塔上的n-1个盘子移动到目的塔上
}
}
static void Main(string[] args)
{
Console.Write("请输入盘子的个数:\n");
int n;
n = Convert.ToInt32(Console.ReadLine());
char x = 'A', y = 'B', z = 'C';
Console.Write("盘子移动情况如下:\n");
hanoi(n, x, y, z);

}


运行结果举例:



2.猴子吃桃的问题

static void Main(string[] args)
{
int a=Taozi(1);
Console.WriteLine(a);

}
static int Taozi(int day)
{
if (day == 7)
{
return 1;
}
int n = (Taozi(day + 1) + 1) * 2;
return n;

}


3.做梦

static void Main(string[] args)
{
//递归函数
//做梦
Test(1);
Console.WriteLine();
}
static void Test(int n)
{
if (n>10)
{
return;
}
Console.WriteLine("这是第{0}次在做梦",n);
Test(n+1);
Console.WriteLine("第{0}次梦醒了",n);
}


运行结果:



4.折纸问题:

static void Main5(string[] args)
{
//折纸
double houdu = 0.00008;
Zhezhi(houdu);
Console.WriteLine(n);
}

static void Zhezhi(double h)
{

if (h>8848)
{
return ;
}

Zhezhi(h*2);
n++;

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