关于我之前关于算法书的持久属性的问题,请参阅here,现在我想问一下社区你会用什么语言来编写这样一本参考书的例子。
我可能不会使用MMIX(!)来编写本书的示例,但与此同时,我认为伪代码不如真实语言中的示例有趣。
不过,我也喜欢这本书也是研究人员的资源。什么可以是社区的选择?为什么呢?
回答:我知道这是一个棘手的问题,会有几个不同的答案。请注意,答案涵盖了从Assembly / MMIX(!!)到Python和伪代码的整个范围。投票和争论迫使我选择Uri的明智答案,但有一点需要注意:我的伪代码将尽可能接近C(当然不会涉及平台特定问题),我可能会讨论更好的实现在旁注中(正如我们所有人都知道的那样,在数学上证明算法的工作原理远远不是实现它的问题)。
这本书是关于特定领域的算法,而不是一般算法的数学(更聪明的人已经完成并且在一般算法上会做得比我好得多)。因此,我认为有一件事会增加这样一本书的价值是算法的存储库,我肯定会把它放在一个配套的网站上(如果我找到时间,可能会用几种语言)。
感谢所有答案。我有时觉得我应该把所有回答的人都作为共同作者。 :)
答案 0 :(得分:13)
关于算法的好书应该用psueod-code a-la-CLR编写......
根据我的经验,大多数针对语言特定示例的书籍最终看起来更像是本科教科书,而不是像严肃的参考书或学习书籍。此外,大多数语言在处理集合时都相当笨重(特别是C ++和Java,甚至是泛型)。在所有细节之间,失去了太多。您还可以立即消除大量潜在受众。
语言特定书籍的唯一优势是,如果您正在编写教科书,发布者可以附加CD并将50美元添加到MSRP。
我更容易从(可读)伪代码中理解算法。如果我不知道如何用我自己的收藏品用我的语言来实现它,那我无论如何都会遇到麻烦。
您可以在每个伪代码中添加一个关于特定语言的实现细节的注释(例如,在Java中使用TreeSet以获得最佳性能等)。
您还可以为本书维护一个单独的网站(无论如何都是好主意),您可以在其中使用不同语言进行实际实施。无需使用长打印输出来杀死树木。
答案 1 :(得分:10)
使用真正的编程语言 - 绝不是假的。读者非常怀疑 psuedo代码,读者喜欢真正的编程语言。伪造语言的陷阱是你可以定义读者无法用他们选择的语言表达的代码概念
真正的编程语言有许多优点:
1)您可以测试您的代码,希望证明您的代码正确无误!
2)您可以将该代码导出为已发布的格式,以便插入到您的图书中, 确保遵循您的代码的任何人都在寻找 在实际的可执行代码中。
3)你不必为psuedo代码辩护。
语言的选择非常主观,但我认为几乎任何现代语言 可以使用,但我推荐一个在快速理解方面具有“最小开销”的方法。并且优选地,读者可以获得编译器/解释器。 如果您想使用C,那么也许您应该查看D.改进的C。
例如,如果你让代码“简单”,Ruby就属于这种情况, Java不是(需要太多的支持库), 在较早的时候,帕斯卡将成为候选人。
BTW:我现在不使用Ruby,因为我目前使用的是Smalltalk& REBOL,但我不会用 书中的任何一种语言。你的书会直接进入剩下的垃圾箱!答案 2 :(得分:2)
我会避免任何抽象出任何特定算法的核心“机制”的东西
答案 3 :(得分:2)
Knuth在汇编级语言中渲染算法有很大的好处。当我们在一些更高级别的语言中编写算法时,它会强制读者仔细考虑芯片中究竟发生了什么。特别是对于系统程序员来说,这种理解是不可能的。
Knuth的新MMIX是理想的:将其视为汇编级伪代码。
我理想的教科书会有伪编码和MMIX编写的算法,因此我们可以看到它的漂亮和复杂形式的算法。伪代码应该优于“真实语言”,因为它避开了无意义的“你应该使用这种语言而不是那种语言”的战斗。在这个阶段,伪代码不需要防御 - 最好的现存算法教科书使用伪代码或在Knuth的情况下使用一种汇编伪代码。
答案 4 :(得分:2)
选择不能取悦所有人。
Robert Sedgewick撰写了他的"Algorithms in..." books in multiple languages。当我开始使用C ++工作时,我有一个课程的C版本并购买了C ++版本。
您无法逃避语言功能(甚至伪语言功能)。
为了尽可能多地取悦你,你可以选择两种语言,比如一种语言,一种不是。它可以帮助说明算法选择的动机。
答案 5 :(得分:1)
我不会使用任何特定的语言。使用伪语言,大多数做过一点编程的人都会清楚这种语言。通常这些书使用接近C风格的东西,但这不是一个规则。我知道您提到您不想使用伪代码,但这样可以让您覆盖更广泛的受众。
答案 6 :(得分:1)
经常使用C样式,因为许多语言使用非常相似的样式,因此大多数程序员在没有解释的情况下理解它。此外,示例可以在任何带有C编译器的机器上运行 - 几乎每台机器都可以运行。
然而,更高层次的概念通常需要使用更新的技术和技术 - 面向对象,函数式编程等。
这些通常以具有所需功能的语言表达。 Java,C#,Erlang,Ada等 - 大多数优秀的程序员只需要一点解释就能掌握正在发生的事情。
但是C几乎是一个普遍的基础 - 如果你采用C风格的话,你真的不会出错。
- 亚当
答案 7 :(得分:0)
我会用一些东西让你准确地表达算法背后的想法。
Haskell非常简洁,但我认为使用与状态一起工作的算法,它可能会妨碍你,而且你会更多地使用语言而不是算法。
我不会使用C或其后代(C ++,C#,Java ......),因为当您的算法本质上更具“功能性”时,它们会妨碍您。同样,您将更多地使用语言而不是算法。如果我不得不在没有高级职能的情况下工作,我会感到非常不舒服。
所以,基本上,我会使用你熟悉的多范式语言,并且你有信心在没有深入语言细节的情况下表达算法。
我个人的选择就像Common Lisp,但也许Python或Scala也可行。
答案 8 :(得分:0)
Python是一个很好的选择。即使您之前没有编程,它也非常易读。此外,它比其他一些常见的语言选择要简单得多。