学习HTDP后写的 python 全排列算法

学习 HTDP 的过程中, 总会提醒自己程序员是要表达自己思想, 而不是在语言层面上编程

 

最近突然神游到了以前写过的全排列算法, 对, 以前写过, 但是现在竟然一点印象都没有了, 

真不知道当时怎么写的, 只知道大概思想, 深度优先搜索, 把要排列的表建立成一颗树。

 

好吧, 用c语言写啊写, 写到最后一事无成, 自己不禁想到, 这是什么回事, 怎么写不出来了, 

猛然发现以前学过的好多算法都忘得一干二净, 不知道从哪里下手。

 

无奈只能google看看别人写的程序, 好吧, 博客里的文章都是一上来就讲算法, 也不知道写

博客的人是真明白还是假明白, 反正我是看不懂, 继而回忆起自己学习数据结构和算法的过

程, 当时只知道这两个东西很重要, 所以必须得学, 却不知道学完他们用他们来做什么, 只是

学的过程中实现了书本上的算法。。。

 

怎么想也想不到个写程序解决问题的所以然来, 只能再去翻 HTDP 这本书, 终于领悟到了一些

东西, 程序设计本身是一件很有创造性的活动, 就像画家和建筑师一样, 所以设计程序是有诀窍

的, 虽然没有银弹。

 

回到全排列的问题上:

首先, 遇到问题, 应该学会用数据表示问题, 好吧, 知道数据结构的用处了

于是毫不犹豫的把 1, 2, 3 表示成一颗树的样子

接下来, 问题用数据表示出来了, 想想输入与输出吧, 输入(1, 2, 3)输出它的全排列

然后程序的大概框架应该有了吧

def permutation(lst):

    if lst == []:

        print perm_lst

    else:

        进一步处理数据

最后, 有了框架, 有了数据结构, 轮到的就只有算法了。

算法思想很简单, 深度优先搜索这棵树

知道了思想, 自己就要用程序来表达自己的思想了

在纸上大概写写了一下步骤, 结果稍微写写, 结果就有了

#!/usr/bin/env python
#coding: 'utf-8'

perm_lst = []

def permutation(lst):
    if lst == []:
        print perm_lst
    else:
        for elem in lst:
            perm_lst.append(elem)
            rest_lst = lst[:]
            rest_lst.remove(elem)
            permutation(rest_lst)
            perm_lst.pop()

if __name__ == '__main__':
    permutation(list('abc'))

 

 总结: 要是大学编程的第一门课是 HTDP 这本书该多好, 可惜学的是C语言, 还是谭浩强的C语言

posted @ 2012-09-16 14:43  run-forever  阅读(504)  评论(1编辑  收藏  举报