@@ -1007,7 +1007,7 @@ As metrics, they must satisfy the following three requirements:
['omg','teh','teh','mat','omg','teh','teh','mat']
```
我们第一次调用`find_words()`❶,我们得到所有预期的三个字母的词。第二次,我们为 result 指定一个初始值,一个单元素列表`['ur']`,如预期,结果中有这个词连同我们的文本中的其他双字母的词。现在,我们再次使用❶中相同的参数调用`find_words()`❸,但我们得到了不同的结果!我们每次不使用第三个参数调用`find_words()`,结果都只会延长前次调用的结果,而不是以在函数定义中指定的空链表 result 开始。程序的行为并不如预期,因为我们错误地认为在函数被调用时会创建默认值。然而,它只创建了一次,在 Python 解释器加载这个函数时。这一个列表对象会被使用,只要没有给函数提供明确的值。
这两种算法解决同样的问题。一个使用迭代,而另一个使用递归。我们可以用递归处理深层嵌套的对象,例如 WordNet 的上位词层次。让我们计数给定同义词集 s 为根的上位词层次的大小。我们会找到 s 的每个下位词的大小,然后将它们加到一起(我们也将加 1 表示同义词集本身)。下面的函数`size1()`做这项工作;注意函数体中包括`size1()`的递归调用:
作为递归的最后一个例子,让我们用它来构建一个深嵌套的对象。一个字母查找树是一种可以用来索引词汇的数据结构,一次一个字母。(这个名字来自于单词 retrieval)。例如,如果`trie`包含一个字母的查找树,那么`trie['c']`是一个较小的查找树,包含所有以 c 开头的词。4.9 演示了使用 Python 字典(3)构建查找树的递归过程。若要插入词 chien(dog 的法语),我们将 c 分类,递归的掺入 hien 到`trie['c']`子查找树中。递归继续直到词中没有剩余的字母,于是我们存储的了预期值(本例中是词 dog)。
也可以动态的产生这些数据的可视化图形。例如,一个使用表单输入的网页可以允许访问者指定搜索参数,提交表单,看到一个动态生成的可视化图形。要做到这一点,我们必须为`matplotlib`指定`Agg`后台,它是一个产生栅格(像素)图像的库❶。下一步,我们像以前一样使用相同的 Matplotlib 方法,但不是用`pyplot.show()`显示结果在图形终端,而是使用`pyplot.savefig()`把它保存到一个文件❷。我们指定文件名,然后输出一些 HTML 标记指示网页浏览器来加载该文件。