2

我刚刚在测试中丢失了 50% 的答案,因为我在期中写出了代码而不是算法,将我从 A 撞到了 C。写出代码仍然被认为是算法表示吗?

维基百科:算法表示(因为编程风格几乎是基于共识的)

编辑:好的,让我明确几点:

  1. 测试要求使用我们从未在课堂上真正“定义”过的伪代码;我们刚刚为我们的算法写了英文。

  2. 它是一个 Java 类,并在 Java 方法中写出了整个解决方案以及注释。所有这些都是手写的,写出来的时间比伪代码要长。我以为会更清楚。

  3. 我通常不会对这些事情提出异议,但这是 A 和 C 之间的区别,而且我在考试中获得奖学金。

  4. 最后,我写这篇文章有两个原因:

    4.1 我想展示现代编程社区对伪代码和算法表示的看法。

    4.2 我想知道在“现实世界”中什么是可以接受的;我已经编程了一段时间,但我希望能够尽快为开源项目做出贡献,我不想踩到任何人的脚趾。(虽然我很确定这个话题在现实世界中出现的可能性很小)。

再次感谢您的任何帮助/建议。

4

8 回答 8

5

你可能想举个例子。如果您的代码过于关注不属于算法的语言细节,那么可以理解的是,您可以说您的算法中混入了非算法,导致结果不正确。

我觉得推理,学习的全部目的是表明你理解这个概念,而不是弯腰并勾选所有正确的框。

可以教计算机通过大学,但还不能教计算机真正独立思考和应用知识。

吃饭反刍的心态是我一直没毕业的原因。


关于您最近的评论,实现伪代码未定义很重要。它通常有重用的术语,但它不是一种严格的语言,而不是英语(否则它将一种编程语言,可以逐字解析和执行)

伪代码的重要性在于充实系统的逻辑部分,而不必过度担心“它有意义”之外的语法

通常这可以使伪代码更简洁 更易于理解。

伪代码也不依赖于读者理解语言中的“神奇语法”来处理它,他们只需要理解所使用的术语。

例如,如果你要给普通人一个 perl 算法,大多数人会死于恐惧,因为他们看不到线噪音的长板。

尽管:

sub foo { 
   my @args = @_ ; 
   my( $a, $b )=(@args[0],@args[1]); 
   for( @{ $a } ){
       $b .= $_ ; 
       s/id//g; 
   }
   return [$b,$a];
}

对于精通 perl 的人来说,可能会产生一些连贯的感觉,对于普通的代码阅读器来说,他们得到的只是“你刚才到底说了什么”的回应。记录它也没有多大帮助。

| there is a subroute foo which can take a list of strings, and a default string, 
\-  which then iterates all items in  that list, 
| \-  and for each item in that list 
|     1. appends the contents of that item to the end of the default string
|     2. removes all instances of the string "id" in that item
| 
 \ and returns a list, which contains 
    1. the concatentated default string 
    2. the modified input list 

突然间,它变得不那么模棱两可了,更多的人可以理解它。

所以可能,编写算法的一半练习是“你不仅要证明你理解它,你还必须证明你可以向对问题一无所知的其他人解释你的推理”,这是一个至关重要的练习。你需要的能力。如果你不能传达你所做的事情,那么没有人可以使用它。

代码还有一个讨厌的小问题,它不存在于算法中,那就是代码可能看起来正确,但可能不会做你认为它做的事情,如果它做错了,你就不会没有意识到,阅读代码逆向工程的人会弄乱它并复制一个损坏的算法。不好。人类形式的算法更好地翻译“这就是我想要它做的”

于 2008-11-04T23:20:24.373 回答
3

在这种情况下,你必须服从教授。

于 2008-11-04T23:23:03.667 回答
2

您需要提供更多信息。您被要求提供算法,但提供了代码。你评论代码了吗?多少?(我想看看这个问题和你的答案,但也许这要求太多了)。

所以我会根据自己的经验来回答。如果我要求一种算法,那么我想要一些用体面的英语解释如何解决问题和/或满足问题要求的东西。图表也很好(有时更好)。段落,点形式,无论什么 - 它只需要清晰,简洁和正确。

如果您向我提供执行上述操作的代码,则为满分。但是,如果您提供纯“语言”且相当神秘的代码,那么标记将会丢失 - 或多或少取决于代码实际的神秘程度。即使有代码,我也希望看到一个图表,以显示对概念的完全理解。

在教授编程时,我面临的最困难的事情之一就是让学生写得更多,而不是更少。有时我不得不提醒他们,作业(或考试)不是“最容易混淆的代码竞赛”的参赛作品。;-)

干杯,

-R

于 2008-11-04T23:49:08.530 回答
2

作为高级算法课程的评分者,如果有简单的编码解决方案,我总是会扣分。

有些事情在代码中根本无法像用英语那样雄辩地表达出来。伪代码试图摆脱严格的编译器语法并允许一些表现力。这是朝着可理解性的正确方向迈出的一步,但并不总是足够的。

尤其是在算法类中,提供正确性证明(无论是通过归纳、矛盾等)以及算法的空间和时间复杂度的大 O 表示法总是很重要的。

于 2008-11-13T20:04:33.857 回答
0

我所知道的是,在您拥有算法之前,您不应该编写任何代码。

于 2008-11-04T23:15:28.830 回答
0

使用代码而不是伪代码的问题在于,从理论上讲,人们可以假设它是代码,而不是伪代码。无论如何,老师给你评分是因为你的回答,而不是你的知识——你最好按照老师喜欢的方式回答你被要求的内容。是的,我们都知道,你更清楚。但是,你知道,尝试以他人的方式推理从来都不是一个糟糕的练习。而且至少在我的国家,老师有自由评价你的权利,所以……和他相处!

于 2008-11-04T23:29:49.020 回答
0

只要和你的教授谈谈,问他为什么你把问题弄错了。问他什么是正确答案,以及两者之间的根本区别是什么。

会不会是你写的算法不对?

于 2008-11-05T00:56:05.273 回答
0

代码是一种编写算法,以便机器可以执行它。该定义中没有任何内容表明它不是为人类理解而编写的。用 Java 编写是否使您的算法变得模糊?这将决定我是否同意你的老师。

于 2008-11-05T01:22:00.323 回答