想想Python:第12章练习6

时间:2014-12-24 18:54:08

标签: python algorithm recursion data-structures iteration

所以我试图通过think python解决这个练习:

练习6来自第12章:

  

最长的英文单词是什么,仍然是一个有效的英文单词,   当你一次删除一个字母时?

     

现在,可以从任何一端或中间删除字母,但是你   不能重新排列任何字母。每次你丢一封信,你   结束另一个英文单词。如果你这样做,你最终会   打算用一个字母结束,这也将成为一个字母   英语单词 - 在字典中找到的单词。我想知道是什么   最长的单词和它有多少个字母?

     

我将给你一个小小的例子:Sprite。好?你先来   你用精灵来取消一封信,一封来自内心   一句话,把r带走,我们留下了spite这个词,然后我们   把e带到最后,我们留下了唾液,我们把它关掉,我们就是   留下坑,它和我。

     

编写程序以查找可以通过这种方式减少的所有单词,以及   然后找到最长的一个。

我开始编写一些函数,但我仍然坚持使用check_dict函数:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def word_list(textfile='words.txt'):
    res = {}
    for word in open(textfile):
        word = word.strip()
        res[word] = word
    return res

def children(s, wl):
    i = 0
    children = []
    while i < len(s):
        temp = s[:i] + s[i+1:]
        if temp in wl:
            children.append(temp)
        i += 1
    return children

def check_dict(s, wl, res = [], called = 0):
    if len(s) == 1 and s in wl:
        res.append(s)
        return res
    else:
        for child in children(s, wl):
            #print(res,'call number ', str(called), 'with s = ', s, 'whose children are: ', children(s, wl))
            res.append(child)
            check_dict(child, wl, res, called+1)

wl = word_list()
print(check_dict('at', wl))

我遇到的问题是它返回None而不是返回res的内容,除非我运行带有基本情况的函数,即s =&#39; a&#39;或者s =&#39;我&#39;。我知道这个函数贯穿每一条可能的路径,因此它应该返回几个不同的res,但我不太明白我怎么能让这个函数只打印一个从一路走来的res函数调用1个字母long s的参数,足以满足基本情况。

我知道这本书有一个解决方案,但我想知道我做错了什么以及如何修复我的版本。

1 个答案:

答案 0 :(得分:0)

1你需要改变word_list函数,你的word_list函数给dict只有一个项目,其中key和value是相同的,即文件内容。更改函数以从input.txt文件获取单词列表

2在check_dict函数中,在if-else循环之外写入return函数,因为children(s,wl)函数返回空列表。

def word_list(textfile='input.txt'):
    return open(textfile).read().strip().split(" ")

def children(s, wl):
    i = 0
    children = []
    s_len = len(s)
    while i < len(s):
        temp = s[:i] + s[i+1:]
        if temp in wl:
            children.append(temp)
        i += 1
    return children

def check_dict(s, wl, res = [], called = 0):
    if len(s) == 1 and s in wl:
        res.append(s)
    else:
        for child in children(s, wl):
        #print(res,'call number ', str(called), 'with s = ', s, 'whose children are: ', children(s, wl))
            res.append(child)
            check_dict(child, wl, res, called+1)

    return res

wl = word_list()
a = check_dict('sprite', wl)