简单的递归思想: gcd(最大公因数)+hanoi(汉诺塔)+quicksort(快排)

本文探讨了递归编程思想,通过求最大公因数(gcd)、汉诺塔(hanoi)和快速排序(quicksort)三个经典案例,展示了递归在解决复杂问题时的简化作用。文章详细解释了每个问题的递归解决方案,并提供了代码示例,旨在帮助读者理解和应用递归。
摘要由CSDN通过智能技术生成

目录

一、gcd(求最大公因数)

二、hanoi(描述汉诺塔)

三、quicksort(快排)

上次博客本是说这周分享算法的,后来还是想先分享一下递归思想。递归在编程学习中可谓是无处不在,计算机的所有运算拆分开都是递归。比如1+2,可以拆成1+(1+1),同理,所有的加减乘除都可以拆成1+1的式子,这就是递归。给一个拆分的路径,不断地将一个式子递归拆分成一个个小式子,化繁为简。

下面我们用三个经典递归(gcd,hanoi,quicksort)来走进这种思想。

一、gcd(求最大公因数)

求最大公因数,不得不提的就是辗转相除法,也叫欧几里得算法。具体操作:用两数中的较大数除以较小数,之后以除数作被除数,余数作除数,不断相除,以致最后一次余数等于零,此时除数位上的数就为原来两个数的最大公因数。

拿一个具体的例子来说:求20与12的最大公因数。

第一步:20%12==1......8

第二步:12%8==1......4

第三步:8%4==2......0

此时余数已为0,所以20与12的最大公因数为除数位置上的4,即gcd(20,12)==4、

那么用代码如何去实现呢?根据直观感受,我们可以这样写:

int gcd(int x, int y)//自定义函数,确保两数中,x>y
{
	int yu = x % y;//余数
	while (yu)//循环至余数等于零
	{
		x = y;
		y = yu;
		yu = x % y;
	}
	return y;//此时的除数就为最大公因数
}

  但结合除数一定大于余数的知识和递归思想,我们却能进一步简化:

int gcd(int x, int y)
{
	return x % y == 0 ? y : gcd(y,x%y);
}

一个条件表达式,x%y==0吗,即余数等于0吗,如果等于,说明此时有我们想要的y值,如果不等于,继续调用gcd函数本身,依次下去,直到求出最大公因数。好好领悟,只有一行语句(当然也得保证第一次的形参是x>y),是不是简化了特别多?这就是递归奇妙的地方,当你找到某种规律时,递归很有可能就会派上用场。

二、hanoi(描述汉诺塔)

汉诺塔(Tower of Hanoi),又称河内塔

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值