在算法书籍中选择编程语言?

7
在我之前的问题中,关于算法书的持久属性,请参见此处。现在我想问社区,您会使用什么语言来编写这种参考书的示例。
我可能不会使用MMIX(!)来编写书籍示例,但同时,我认为只使用伪代码比使用实际语言的示例要少趣味一些。
尽管如此,我也希望这本书成为研究人员的资源。社区的选择是什么?为什么?
答案:我知道这是一个棘手的问题,会有几种不同的答案。请注意,回答涵盖了从汇编/MMIX(!!)到Python和伪代码的整个范围。投票和论点迫使我选择Uri明智的答案,并附上一个警告:我的伪代码将尽可能接近C(当然,不涉及特定平台的问题),我可能会在侧面说明更好的实现方法(正如我们所有人所知道的那样,数学上证明算法有效远远不是实现它的问题)。
这本书是关于特定领域的算法,而不是关于一般算法的数学(比我聪明得多的人已经做得比我好,将来也会做得比我好得多)。因此,我认为增加这样一本书的价值的一件事是算法的存储库,我肯定会在配套网站上在线发布它们(如果我有时间的话,可能会用几种语言)。
感谢所有答案。有时候我觉得应该把回答的人都列为合著者。 :)

“我有时候觉得应该把所有回答的人都列为共同作者。” - 如果你想分享版税,我不会拒绝。 :-) - Jason Baker
你读过Coreman的书吗?它非常标准,而且效果相当不错。虽然他们在某些细节上有所省略,但对于本科生来说非常好。 - BobbyShaftoe
关于“试图接近 C 代码”,我希望你避免动态分配的复杂性以及传递指针(而不是引用)语义。 - Uri
我非常喜欢将算法拆分成函数进行编写,只要可能的话。如果对于代码来说是正确的,那么对于可读性强的算法也应该是好的。 - Uri
9个回答

13
一个好的算法书应该采用类CLR的伪代码写作,避免过多地使用特定编程语言的示例,因为这样会导致书籍更像本科教材而非专业参考书或学习书籍。此外,大部分编程语言在处理集合时都相当笨拙(特别是C++和Java,即使有泛型也是如此),细节繁琐,容易迷失重点,而且这样做也会立即排除掉很多潜在读者。唯一的优点是如果你想要写一本教材,出版商可以附上一张光盘并将MSRP提高50美元。
我更喜欢通过(易读的)伪代码来理解算法。如果我无法弄清楚如何使用自己的集合在我的编程语言中实现它,那么我就遇到了麻烦。
你可以在每个伪代码清单中添加关于特定编程语言实现细节的说明(例如,在Java中使用TreeSet获得最佳性能等)。
你还可以为该书维护一个单独的网站(这是个好主意),其中包含不同编程语言的实际实现。没有必要用长篇大论的打印纸消耗资源。

不同意并且讨厌在书籍中使用伪代码。 - cletus
实际上,我更喜欢书中的伪代码。如果编写正确,伪代码实际上很容易理解。虽然有些书会同时展示伪代码和C或Java代码。 - BobbyShaftoe
2
伴随伪代码的代码应该以电子形式提供,最好通过网站。这样可以减少纸张浪费,更易于复制和粘贴,也更易于更新勘误和编程惯例。 - Uri
我倾向于不同意,因为伪代码通常不够精确。我不介意将算法从一种语言实现到另一种语言,但是对于伪代码,你不知道... x[1]是数组的第一个元素还是第二个元素?因为这样的事情,我花时间尝试解码伪代码,即使那样也可能会出错。真正的代码必须编译,所以如果有疑问,您可以运行它并进行检查。 - jkerian

10

使用真正的编程语言——而不是伪代码。读者对伪代码非常怀疑,他们喜欢真正的编程语言。伪语言的陷阱在于你可以定义读者无法在他们选择的语言中实现的代码概念。

真正的编程语言有许多优点:

1)您可以测试您的代码,希望证明您的代码是正确的!

2)您可以将该代码导出为已发布格式,以便插入您的书中,确保任何遵循您的代码的人都会查看实际可执行代码。

3)您不必为您的伪代码辩护。

语言的选择显然是主观的,但我认为几乎任何现代语言都可以使用,但我建议选择一个在快速理解方面具有“最小开销”的语言。最好是读者可以获得编译器/解释器的语言。如果您想使用C,则可以尝试D。这是一个改进版的C。

例如,如果您保持代码“简单”,则Ruby就是这种类型的语言,Java不是(需要太多的支持库),在早期,Pascal可能是一个候选。

顺便说一下:我现在不使用Ruby,而是使用Smalltalk和REBOL,但我不会在书中使用这些语言。你的书将直接进入剩余库存!


1
你能提供一些数据结构书中使用伪代码概念的例子,这些概念在特定的现实世界语言中无法实现吗? - user57368
不,你会使用的任何现实世界语言都是图灵完备的(请不要让我担心一些不是图灵完备的定理证明语言)。 - BobbyShaftoe
我从未见过任何半明白的开发人员无法将其翻译为真正的语言的[好的]伪代码。我见过我的代码,即使是好的开发者也无法将其翻译成伪代码... - Uri

2
我建议不要使用任何抽象出某个特定算法核心“机制”的东西。

2
在Knuth用汇编语言呈现算法中,有着巨大的好处。它迫使读者仔细考虑在某些高级语言中编写算法时硅片上正在发生的事情。特别是对于系统程序员,这种理解方式是无法通过其他途径获得的。
Knuth的新MMIX非常理想:把它视为汇编级伪代码。
我的理想教科书将使用伪代码和MMIX编写算法,以便我们可以看到算法的美丽和复杂形式。伪代码应优先选择“真实语言”,因为它避免了毫无意义的“你应该使用这种语言而不是那种语言”的争论。在这个阶段,伪代码不需要辩护——最好的现有算法教科书使用的是伪代码或者像Knuth一样一种类似汇编的伪代码。

2
选择不可能取悦每个人。 Robert Sedgewick已经用多种语言写了他的《算法》图书系列。我在上课时用的是C语言版本,后来开始工作用C++时又买了C++版本。 你无法避免语言特性(即使是伪语言特性)。 为了尽可能地取悦更多的人,你可以选择两种语言,比如一种函数式语言和一种非函数式语言。这可以帮助阐明算法选择的动机。

1
我不会使用任何特定的编程语言。使用一种伪语言,这将对大多数有一点编程经验的人来说是清晰的。通常这些书籍使用接近C风格的东西,但这并不是一个规则。我知道你提到你不想使用伪代码,但这将允许你达到更广泛的受众。

1

C风格经常被使用,因为许多语言使用非常类似的风格,大多数程序员都可以不用解释就理解它。此外,可以在任何具有C编译器的机器上运行示例-几乎所有机器都有。

然而,更高级的概念通常需要使用更近期的技术和技巧-面向对象编程、函数式编程等。

这些通常用具有所需功能的语言表达。Java、C#、Erlang、Ada等--大多数好的程序员只需要一点解释就能理解发生了什么。

但是C几乎是一个普遍的基础--如果你采用C风格来举例,你真的不会出错。

-Adam


0

我会使用一些可以准确表达算法背后思想的工具。

Haskell非常不错,但是对于需要处理状态的算法来说,它可能会成为障碍。你会更关注语言本身而不是算法。

我不会选择C或其后代(C ++,C#,Java ...),因为当您的算法更具“功能性”时,它们会妨碍您。同样,你会更关注语言而不是算法。如果没有高阶函数,我会感到非常不舒服。

因此,基本上,我会使用多种编程范式的语言,你要选择自己熟悉且自信能够表达算法的语言,而不用深入涉及语言细节。

我的个人选择会是像Common Lisp这样的语言,但也许Python或Scala也是可行的。


0

Python是一个全方位的好选择。即使您以前没有使用过它进行编程,它也非常易读。此外,它比其他一些常见的语言选择更简洁。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接