我是数学专业的,研究生作最优化 /数值计算方向的.虽然不是计算机科班专业,但是也会要经常要写些程序跑一些实验看看算法效率和稳定性.当然,我们主要的功夫在推导和证明上,写的这些这些程序应该不会有专业计科同学做的项目复杂了.
我想提高编程能力,除了是因为学习工作中很有用之外,还有一个原因可能是:我现在觉得编程很有趣.掌握数据结构对于提高编程能力很有好处,所以我打算假期自己学学数据结构.其实这些数据结构理解起来还不算很难,但是具体练习时的项目会复杂一些.
我的问题:
1.自学的话也常常不知道自己的代码写得对不对(因为没有那种 JO 系统),都只好自己输入些简单例子看一看这样.有时挣扎一番应该是说写出来一个能不报错的,但是因为测试集很小(都是自己手敲的)不知道是不是写得对.
2.如果写对了,不知道自己写得好不好.之前上课的话老师会抓些作业典型讲哪里哪里写得好或者不好.
3.除了 CS 科班专业的同学以外,你当初为什么考虑学习编程,你学习编程的心态是怎样的呢?
所以大家有什么建议?
我的基础:
我之前学过一个学期的 JAVA 程序设计课,就是学校开设的为非 CS 专业同学算是半个必修课吧(程序设计是必修,有几种语言可以选,但是非 CS 专业可以随便挑一种学).后来我在 Coursera 上自己学了一点 Python,大概就是基本的 control flow, exception, class 之类.
另外随便贴出一段代码(解汉诺塔问题),请大家看看有没有问题.
'''Write a program that can solve instances of the Tower of Hanoi problem
(from Exercise C-4.14).'''
class Hanoi :
'''Hanoi tower.'''
class pag :
'''Pag of a Hanoi tower'''
def __init__(self, name : str, disk = [] ):
'''Create a pag of a Hanoi tower with given disk as stack.'''
self.disk = disk
self.name = name
def __str__(self) -> str:
return self.name + ':' + str(self.disk)
def __init__(self, n : int):
'''Create a Hanoi tower with n disks.'''
self.a = Hanoi.pag(name = 'a')
self.b = Hanoi.pag(name = 'b')
self.c = Hanoi.pag(name = 'c', disk = [i for i in range(n)])
self.n = n
self.pags = {self.a, self.b, self.c}
def __str__(self) -> str:
x = str(self.a)
y = str(self.b)
z = str(self.c)
return x + '\n' + y + '\n' + z
def move_disk(self, pag1 : pag, pag2 : pag):
'''move the top element from pag1 to pag2.'''
if (len(pag2.disk) == 0) or (pag1.disk[0] < pag2.disk[0]):
x = pag1.disk[0]
pag1.disk = pag1.disk[1:]
pag2.disk = [x] + pag2.disk
print('disk element',x,'on the top of pag',pag1.name,'has been moved to the top of',pag2.name)
else:
raise ValueError('illegal move.')
def move_Hanoi(self, pag1 : pag, pag2 : pag, k : int ):
'''move the top k elements on the top of pag1 to pag2'''
def find_transfer():
'''Find tansfer station.'''
s1 = {pag1, pag2}
s2 = self.pags.difference(s1)
pag3 = s2.pop()
return pag3
pag3 = find_transfer()
if (k <= 0) or (k > len(pag1.disk)):
raise IndexError('k must be a positve integer less than length of pag2.disk.')
if k == 1:
self.move_disk(pag1, pag2)
else:
self.move_Hanoi(pag1, pag3, k-1)
self.move_disk(pag1, pag2)
self.move_Hanoi(pag3, pag2, k-1)
def solve_Hanoi(self):
'''Solve the Hanoi tower.'''
self.move_Hanoi(self.c, self.a, self.n)
print(self)
if __name__ == '__main__':
hanoi = Hanoi(5)
print(hanoi)
hanoi.solve_Hanoi()
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.