很想写一个很好的文章引子,但是囿于语文水平有限,写不出什么好东西来,干脆就随便写点东西吧。之前写的文章都是关于爬虫的,爬虫虽好,但是写来写去就是那些东西,是时候学习点新东西了!现在自己很缺关于算法的知识,于是就上计蒜客学习了基础算法入门,但是苦于它教学用的是C++,而我大一学过C++,现在早就忘光了。于是我将写几篇系列文章,将计蒜客上面的C++算法改写成Python。
这是第三篇文章《深度搜索(2)》
以下文字摘自计蒜客
问题背景:
蒜头的数学实在是太差了,于是老师把他关到小黑屋让他闭门修炼。老师跟他一张纸,上面一排写着1, 2, 3...N这N个数,中间用空白分隔。老师让他在空白处填上加号或者减号。他让蒜头君求出一共有多少种加运算符的方法使得整个表达式的值为0,并输出所有的方案。比如N=7时,1 2 3 4 5 6 7排成一排,一种插入符号的方案为1+2-3+4-5-6+7=0。是不是很有趣,快来帮蒜头君解出这题吧(*´▽`)ノノ
输入为一行,包含一个整数N(3≤N≤9)。
输出为所有在每对数字间插入“+”或“-”后能得到和为零的数列,并按照字典(ASCII码)序排列。如果无解就输出一行None。
不知道字典序和ASCII也不要紧,我们看样例输出就清楚啦,1到N排成一排,先每个位置优先放"+",再放"-",这么放的原因是因为"+"的ASCII码要比"-"小。
样例1
输入:
7
输出:
1+2-3+4-5-6+7
1+2-3-4+5+6-7
1-2+3+4-5+6-7
1-2-3-4-5+6+7
C++的算法看这篇文章《深度搜索之蒜头学算术》
然后C++的代码我就不说了,因为我不熟。
主要是我改写的Python版本代码:
#-*- coding=utf-8 -*- from copy import deepcopy#列表的复制用deepcopy,至于为什么?百度之 def dfs(num,deep=1,sum=1,store=[]): if deep==num: if sum==0: formula='' for i in range(num): formula+=str(i+1) if i !=num-1:formula+=store[i] print formula else: s1=deepcopy(store);s2=deepcopy(store) s1.append('-');s2.append('+') return dfs(num,deep+1,sum-deep-1,s1),dfs(num,deep+1,sum+deep+1,s2) if __name__=='__main__': num=6 dfs(num)
其实也没什么好说的,主要一点是
s1=deepcopy(store);s2=deepcopy(store)
这里用到的是deepcopy!不是深入了解Python的人可能会不了解deepcopy的作用,简单来说,如果不是用deepcopy,而只是用:
s1=store; s2=store;
会出现什么情况呢?打个比方就很清楚了!
from copy import deepcopy s1=[1,2,3] s2=[1,2,3] s11=s1 s22=deepcopy(s2) s11.append(4) s22.append(4) print s1 print s2
猜会输出什么结果?你觉得可能是:
[1,2,3] [1,2,3]
但其实结果是:
[1,2,3,4] [1,2,3]
看出什么不同了吧?
嗯,我不会表达,只能举栗子说明问题了!
END!