【递归】两道程序题理解递归

这篇博客介绍了递归的概念,包括直接递归和间接递归,并通过实例展示了如何使用递归算法实现辗转相除法求最大公约数。此外,还详细解释了组合数C(n,m)的计算方法,利用递归实现组合数的求解,并给出了实际的Python代码示例。最后,提供了两种递归算法的运行示例及其输出结果。
摘要由CSDN通过智能技术生成
递归的定义

在定义一个过程或者函数时,出现直接或间接调用自己的部分,称为递归。直接调用自己称为直接递归,间接调用自己称为间接递归。

第一题

编写一个递归函数计算最大公约数。使用该函数编程计算键盘输入两个整数m,n,求m,n的最大公约数和最小公倍数。

提醒:输入语句为:m,n=map(int,input().split())

输出语句为:print(‘最大公约数={},最小公倍数={}’.format(gcd(m,n),m*n//gcd(m,n)))

例如输入样例:

28 26

则输出样例为:

最大公约数=2,最小公倍数=364

答案:

def gcd(m,n):

    if m%n==0:

        return n

    else:

        return gcd(n,m%n)

m,n=map(int,input().split())

print('最大公约数={},最小公倍数={}'.format(gcd(m,n),m*n//gcd(m,n)))

简单说明一下,这道题的关键在于理解求两个最大公约数的算法公式。这里有两种情况:

  1. a%b==0时,易知b是a,b的最大公约数。比如15和5、20和5、24和6都是这样。
  2. a%b!=0,假设a%b= =c,易知a=nb+c(n为整数),如果迭代一次,b%c= =0,那么b=mc(m为整数)。把它代到前面的式子,有a=nm*c+c=(nm+1)c,而mn+1为整数,也就说明a也为c整除,c是a,b的最大公约数。所以这也是通过不断迭代的方式求出最大公约数。这种方法叫辗转相除法,也叫欧几里得算法,是计算机求最大公约数的常用方法。
第二题

编写求组合数C(n,m)

def combin(m,n):
	if m==n or n==0:
		return 1
	else:
		return combin(m-1,n-1)+combin(m-1,n)
m=int(input('请输入m的值:'))
n=int(input('请输入n的值:'))
print('C({},{})={}'.format(n,m,combin(m,n)))

这里作简要说明,和上一题的思路类似,也是两种情况:
1、如果m= =n或者n= =0,这个时候C(n,m)是1,很好理解,全取和全不取,值是1。
2、如果m!=n时,可以假设有一个固定的盒子,代号X,这个时候对于从m个盒子里拿n个盒子的我来说,无非取和不取两种情况。如果取就是:C(1,1)*C(n-1,m-1) ,分步用乘法。
如果不取就是:C(n,m-1)。然后把两个加起来,因为分类用加法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值