If you're seeing this message, it means we're having trouble loading external resources on our website.

如果你被网页过滤器挡住,请确保域名*.kastatic.org*.kasandbox.org 没有被阻止.

主要内容

表达一个算法

我们可以用多种方法表达一个算法,包括自然语言、流海图、伪代码,当然还有实际编程语言。
自然语言是常见的选择,因为它对我们来说很自然,并且可以将算法的步骤传达给广大用户。 在开发算法时,我们经常与了解编程的人和不懂编程的人一起工作,但是他们都懂自然语言。
但是,自然语言有其缺点。它倾向于模糊不清,定义太模糊,因为没有强制的结构,这使其他人难以遵循算法,并对其正确性有信心。流程图和伪码是更加结构化的格式,可以更准确地表达算法,并且很受计算机科学家和程序员的欢迎。
让我们通过表达上一篇文章中的Pig Latin算法来尝试较结构化的格式。

流程图

表达算法的一个更正式的方式是 流程图,一个用箭头连接方框的图形。
为了更容易开始,这是一个 Pig Latin 算法的基本版本的流程图:
基本Pig Latin算法的流程图,有6个节点从一个指向下一个:
  • "Start"
  • "Append "-""
  • "Append first letter"
  • "Append "ay""
  • "Remove first letter"
  • "End"
每个矩形代表序列中的一步,箭头从一步到下一步。
这下一个流程图是为了改进算法,使用菱形框来代表选择阶段:
改良Pig Latin算法的流程图,开始于3个节点从一个指向下一个:
  • "Start"
  • "Append "-""
  • "Store first letter"
然后一个菱形节点有选择条件“第一个词 = vowel?”。
一个标记为“true”的箭头指向:
  • "Append "yay""
  • "End"
一个标记为"false”的箭头指向:
  • "Append first letter"
  • "Append "ay""
  • "Remove first letter"
  • "End"
最后,这个流程图可以显示带有迭代完整算法:
最终Pig Latin算法的流程图,开始于3个节点从一个指向下一个:
  • "Start"
  • "Store words"
  • "For word in words"
一个标记为“word”的箭头从那里指向一个嵌套的流程图,它开始于:
  • "Start"
  • "Append "-""
  • "Store first letter"
然后一个菱形节点有选择条件“第一个词 = vowel?”。
一个标记为“true”的箭头指向:
  • "Append "yay""
  • "End"
一个标记为"false”的箭头指向:
  • "Append first letter"
  • "Append "ay""
  • "Remove first letter"
  • "End"
一个箭头从嵌套的流程图中的“End”指回到“For word in words”。
一个标记为“end of words”的箭头从“For word in words”指到“End”节点。
在流程图中表现算法,使我们能够在高级别上把算法可视化,同时迫使我们非常仔细地考虑顺序和选择。哪些箭头可以指向什么节点?有没有缺失的箭头?这些是算法转化为流程图时可能出现的宝贵问题。

伪代码

最终,大多数算法变成实际运行于计算机的代码。在此之前,程序员往往想要在 伪代码 中表达算法:使用编程语言的所有构造函数的代码,但不在任何地方实际运行。
这是以AP CSP 伪代码样式写出来的 Pig Latin算法:
FOR EACH word IN words
{
  APPEND(word, "-")
  letter ← FIRST_LETTER(word)
  IF (IS_VOWEL(letter)) {
    APPEND(word, "yay")
  } ELSE {
    APPEND(word, letter)
    APPEND(word, "ay")
    REMOVE_FIRST(word)
  }
}
每个程序员写不同的伪代码,因为没有官方标准,所以您会读到看起来完全不同的伪代码。
用伪码表示算法帮助程序员熟悉术语,而不必担心语法和具体内容。它还使计算机科学家拥有一种独立于语言的方法来表达一种算法,从而使任何语言的程序员能够走到一起,阅读伪代码,并将其翻译成他们选择的语言。

编程语言

一旦我们计划好我们的算法,无论是以自然语言、流海图、伪码还是这些的组合,我们就可以将其变成运行代码。
我们将把Pig Latin 算法翻译成JavaScript,因为这是我们在可汗学院选择的语言。我们可以使用for循环来重复,一个if/else 来选择,然后混合一系列字符串和向量的操作来进行这些步骤。
📝 类似的代码参见: App Lab | Snap | Python
一个算法可以翻译成任何一般用途编程语言。证明参见 RosettaCode.org,一个列出数百种算法翻译至700多种语言的维基。
软件以各种编程语言写成,取决于其做什么,以及谁编写的。可汗学院目前用于不同代码库的各个部分使用四种不同的语言。幸运的是,我们可以到处使用相同的算法!

🙋🏽🙋🏻‍♀️🙋🏿‍♂️您对此主题有任何疑问吗? 我们很乐意回答-只需在下面的问题区域中提问即可!

想加入讨论吗?

尚无帖子。
你会英语吗?单击此处查看更多可汗学院英文版的讨论.