python实现整数划分问题算法和全排列问题递归算法

整数划分问题算法

例如:6的整数划分问题
6
5+1
4+2,4+1+1
3+3,3+2+1,3+1+1+1
2+2+2,2+2+1+1,2+1+1+1+1
1+1+1+1+1+1
一共有11种划分方法

'''
	整数划分问题
	求出整数划分的个数
'''

'''
	整数划分个数
	@param n 需要划分的整数
	@param m 
	return sum	整数划分的个数
'''
def f( n, m ):
	'''
		如果n,m都小于1,则无法划分
	'''
	if( n < 1 or m < 1 ):
		return 0
	'''
		如果n=m=1,则只有一种划分方法
	'''
	if( n == 1 and m == 1 ):
		return 1
	'''
		如果m>=n,则和m=n是一样的,递归计算
	'''
	if( n <= m ):
		return 1 + f( n, n - 1 )
	'''
		如果m>n,递归计算
	'''
	return f( n, m-1 ) + f( n - m, m )

	
print( f( 6, 3 ) )

该算法同样使用了分治的思想,不断细分。

全排列问题的递归算法

例如:R = {a,b,c},所有的排列组合为:abc,acb,bac,bca,cba,cab;

'''
	全排列算法——python实现
'''

'''
	全排列函数
	@param list 列表指针
	@param k	排列的起始位置
	@param m	排列的结束位置
	return void
'''
def perm( list, k, m ):
	#如果只剩下一个元素,直接输出
	if( k == m ):
		for i in list:
			print( i, end = "" )
		print( "" )	
	else:
		i = k;
		while i <= m:
			swap( list, k, i )
			perm( list, k+1, m )
			swap( list, k, i )
			i = i + 1

'''
	交换列表中的元素
	@param list 列表指针
	@param k	列表元素下标
	@param m	列表元素下标
	return void
'''			
def swap( list, k, m ):
	temp = list[m]
	list[m] = list[k]
	list[k] = temp
	
list = [ "a", "b", "c" ]
perm( list, 0, len( list )-1 )

'''
	在python3.6.1中运行的结果:
	==================================
	abc
	acb
	bac
	bca
	cba
	cab
	==================================
	总结:
		需要注意python中传值传引用的问题,
		如果函数收到的是一个可变对象(比如字典或者列表)的引用,
		就能修改对象的原始值--相当于通过“传引用”来传递对象。
		如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,
		就不能直接修改原始对象--相当于通过“传值'来传递对象。
'''

你可能感兴趣的:(算法)