2014-12-24 5 views
1

Так что я пытаюсь решить это упражнение с мозговым питона:Подумайте Python: Глава 12 Упражнение 6

Упражнение 6 Из главы 12:

Что самое длинное английское слово, что остается в силе Английское слово, , когда вы удаляете его буквы по одному за раз?

Теперь буквы могут быть удалены с любого конца или посередине, но вы не можете изменить любые буквы. Каждый раз, когда вы бросаете письмо, вы получаете с другим английским словом. Если вы это сделаете, вы, в конце концов, получите , чтобы завершить с одной буквой, и это тоже будет Английское слово-одно, которое находится в словаре. Я хочу знать, что такое самое длинное слово и сколько у него букв?

Я расскажу вам немного скромный пример: Sprite. ОК? Вы начинаете со спрайтом, вы берете письмо, один из внутреннего слова , убирайтесь, и мы остаемся со словом «злобный», затем мы с берем с конца, мы осталось слюной, мы возьмем 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)) 

У меня есть проблема в том, что она возвращает None вместо возврата содержимого Рез, если я не запустить функцию с базовый случай, который равен s = 'a' или s = 'i'. Я знаю, что эта функция проходит через все возможные пути и, как таковая, должна возвращать несколько разных res, но я не совсем понимаю, как я могу заставить эту функцию печатать только одну res, которая полностью идет от параметра, с помощью которого функция вызывается в 1-буквенную длину s, которая соответствует условию базового случая.

Я знаю, что есть решение в книге, но я хочу знать, что я делаю неправильно, и как я могу исправить свою версию.

+0

В ветке 'else' нет' return'. –

+0

@Rawing Рекурсивная функция –

+1

@BhargavRao: Он все еще ничего не возвращает (aka None), даже если он рекурсивный. –

ответ

0

1 Вам нужно изменить функцию word_list, ваши функции word_list выдают dict, у которых есть только один элемент, где ключ и значение - это то же самое, что и содержимое файла. Измените функцию, чтобы получить список слов из файла input.txt

2 В функции check_dict введите функцию возврата за пределы цикла if-else, потому что функция 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) 
+0

1. это предназначено. Это связано с тем, что в словарях python быстрее доступ к спискам, поскольку к ним обращаются с помощью хеш-функции, в то время как списки должны пройти. 2. Это не работает хорошо, так как оно всегда будет возвращать True. Мне удалось получить вывод, который я ищу. Я отправлю свое решение как можно скорее, но оно просто состоит из добавления возврата до рекурсивного вызова check_dict следующим образом: 'return check_dict (child, wl, res, called + 1)'. Я не отправляю его, потому что сейчас я не понимаю, почему он работает, но моя версия не работает. – user3182422

+0

да, словари быстрее доступны. ожидая вашего сообщения. –

Смежные вопросы