递归的定义
在定义一个过程或者函数时,出现直接或间接调用自己的部分,称为递归。直接调用自己称为直接递归,间接调用自己称为间接递归。
第一题
编写一个递归函数计算最大公约数。使用该函数编程计算键盘输入两个整数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)))
简单说明一下,这道题的关键在于理解求两个最大公约数的算法公式。这里有两种情况:
- a%b==0时,易知b是a,b的最大公约数。比如15和5、20和5、24和6都是这样。
- 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)。然后把两个加起来,因为分类用加法。