这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。
比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?
Python解法1,普通递归版全排列:
def connect_int(i1,i2,i3): return int(str(i1)+str(i2)+str(i3)) def dfs(nums): if len(nums)==9: if nums[0]+nums[1]/nums[2]+connect_int(nums[3],nums[4],nums[5])/connect_int(nums[6],nums[7],nums[8])==10: global count count+=1 print(nums) return for i in range(1,10): print(nums) nums.append(i) print(nums) dfs(nums) nums.pop() count=0 alist=[] dfs(alist) print(count)
解法1分析,这种用递归一个一个试所有全排列可能性的方法是十分低效的。
备注,可以利用sys.setrecursionlimit(3000)修改递归深度
Python解法2,优化版全排列:
import copy def perm(n): data=[] if n==1: data.append([1]) else: #m为n-1层data数据中的一项,存储了n-1位的全排列 for m in perm(n-1): for j in range(len(m)+1): k=copy.copy(m) k.insert(j,n) data.append(k) return data def connect_int(i1,i2,i3): return int(str(i1)+str(i2)+str(i3))
count=0 for nums in perm(9): if nums[0]+nums[1]/nums[2]+connect_int(nums[3],nums[4],nums[5])/connect_int(nums[6],nums[7],nums[8])==10: count+=1 print(nums) print(count)
解法2分析,优化后的全排列只需要递归9次,其余交给列表来做,其实insert方法对性能影响也不小,每次插入后需要重新移动元素,但比解法1高效。
备注:有时间还需要再分析下解法1为什么非常低效