思考Python:第12章练习6

思考Python:第12章练习6,python,algorithm,recursion,data-structures,iteration,Python,Algorithm,Recursion,Data Structures,Iteration,因此,我试图从think python解决这个练习: 第12章练习6: 最长的英语单词是什么,它仍然是一个有效的英语单词, 当你一次删除一个字母时 现在,字母可以从两端或中间删除,但您 无法重新排列任何字母。每次你投下一封信,你 最后用另一个英语单词结束。如果你这样做,你最终会 最后只有一封信,这也将是一个挑战 在字典里找到的一个英语单词。我想知道发生了什么事 最长的单词有多少个字母 我要给你们举个小例子:雪碧。好啊你开始 和雪碧一起,你取下一封信,一封来自房间内部 单词,去掉r,剩下的单词是“

因此,我试图从think python解决这个练习:

第12章练习6:

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

现在,字母可以从两端或中间删除,但您 无法重新排列任何字母。每次你投下一封信,你 最后用另一个英语单词结束。如果你这样做,你最终会 最后只有一封信,这也将是一个挑战 在字典里找到的一个英语单词。我想知道发生了什么事 最长的单词有多少个字母

我要给你们举个小例子:雪碧。好啊你开始 和雪碧一起,你取下一封信,一封来自房间内部 单词,去掉r,剩下的单词是“怨恨”,然后我们 把末端的e去掉,剩下的是口水,把s去掉,剩下的是 留下了坑,它和我

编写一个程序,找出所有可以用这种方法减少的单词,然后 然后找到最长的一个

我开始编写一些函数,但我一直停留在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))
#/usr/bin/env python
#-*-编码:utf-8-*-
def word_列表(textfile='words.txt'):
res={}
对于打开的word(文本文件):
word=word.strip()
res[word]=word
返回res
def儿童(s、wl):
i=0
儿童=[]
而我
我遇到的问题是,除非我使用s='a'或s='I'的基本情况运行函数,否则它将返回None而不是res的内容。我知道这个函数运行在每一条可能的路径上,因此它应该返回两个不同的res,但我不太明白如何让这个函数只打印一个res,从调用函数的参数一直到与基本情况相当的1个字母长的s


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

1您需要更改word列表函数,您的word列表函数提供dict,其中只有一个项的关键字和值相同,即文件内容。更改函数以从input.txt文件获取单词列表

2在check_dict函数中,将返回函数写入if-else循环之外,因为子函数(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)
def word_列表(textfile='input.txt'):
返回open(textfile).read().strip().split(“”)
def儿童(s、wl):
i=0
儿童=[]
s_len=len(s)
而我
else
分支中没有
return
。@绘制它是一个递归过程function@BhargavRao:即使是递归的,也不会返回任何内容(也称为None)。
check\u dict
res
参数应该包含什么,其用途是什么?2.什么可能的值应该能够返回,它们表示什么?1。res是从完整单词到1字符字符串最终字符串的单词的结果轨迹。2.check-dict应该能够在出现故障时返回res或False。我希望支票只返回[sprite]、[pit]、[it]、[I']1。这是有意的。这是因为在python中,字典的访问速度比列表快,因为它们是通过哈希函数访问的,而列表需要遍历。2.这并不能很好地工作,因为它总是会返回真值。我已经能够得到我想要的输出。我会尽快发布我的解决方案,但它只是在递归调用check dict之前添加一个return,如下所示:
return check dict(child、wl、res、called+1)
。我没有发布它,因为现在我不明白为什么它能工作,但我的版本不能。是的,字典的访问速度更快。正在等你的帖子。