关于递归

所谓递归,我个人理解就是自己调用自己

递归有三个条件:

1、前进(规模缩小)

2、边界条件

3、返回段

下面我们通过一个函数举例:

int Age(int n)
{
   int tmp;
   if(n == 1)
      tmp = 10;
   else
   tmp = Age(n-1)+2;
   return tmp;
}

这段代码是计算关于第n个人的年龄的递归算法

如果将其写成循环的写法,就是下面的代码

int Age1(int n)
{
    int i;
    for(i = 0; i < n;i+=2);
    return i;
}

貌似看起来更简单了一些,这确实,很多时候循环的写法比递归更容易让人理解,而且比递归要简单很多,那为什么我们还是要学习递归算法呢?当然是因为递归算法有他的特点和好处,我们通过下面这个题目来仔细了解一下递归的有点。

相传印度有个古老的传说:在一座庙里有三根宝石针,其中一根上面穿了64个大小不一的金片,就是所谓的汉诺塔。然后有这样的规则:一次只移动一片,不管在哪根针上,小片必须在大片上面。只要将64片金片移动到另一根银针上,有小到大排列,世界就会在一声霹雳中毁灭。

汉诺塔是个悲伤的故事,那我们思考一下如何用递归解决汉诺塔问题呢?

首先我们肯定要定义三个宝石针:

void Hanoi(int n,char a,char b,char c)

其次当银针上的金片数量先从一开始:

if(n == 1)
    {
        Move(a,c);
    }

我们就可以直接让其返回到目标位置。

其次每次增加我们都可以让n-1个金片移动到目标位置,其次再按顺序将最后一个移到目标位置

完整代码如下:

void Hanoi(int n,char a,char b,char c)
{
	if(n == 1)
	{
		Move(a,c);
	}
	else
	{
		Hanoi(n-1,a,c,b);
		Move(a,c);
		Hanoi(n-1,b,a,c);
	}
}

相反,如果使用循环写就会十分麻烦,各位有兴趣可以试着用循环写一下,感受一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值