Проблема в алгоритме рекурсивного поиска

d={'global': {'a': 10, 'b': 4, 'func': {'n': "foo", 'x': 'spam', 'func_f': {"d": 0}, 'min': {"c": 5}} }}
def search(d, skey):
    print("search(  %s  )" % d)
    for i in d:
        if i==skey:
            print("return %s" % d[i])
            return d[i]
        else:
            if type(d[i])==dict:
                return search(d[i], skey)

print(search(d, 'func_f'))

print(search(d, 'min'))

Output:

search(  {'global': {'a': 10, 'b': 4, 'func': {'n': 'foo', 'x': 'spam', 'func_f': {'d': 0}, 'min': {'c': 5}}}}  )
search(  {'a': 10, 'b': 4, 'func': {'n': 'foo', 'x': 'spam', 'func_f': {'d': 0}, 'min': {'c': 5}}}  )
search(  {'n': 'foo', 'x': 'spam', 'func_f': {'d': 0}, 'min': {'c': 5}}  )
return {'d': 0}
{'d': 0}

search(  {'global': {'a': 10, 'b': 4, 'func': {'n': 'foo', 'x': 'spam', 'func_f': {'d': 0}, 'min': {'c': 5}}}}  )
search(  {'a': 10, 'b': 4, 'func': {'n': 'foo', 'x': 'spam', 'func_f': {'d': 0}, 'min': {'c': 5}}}  )
search(  {'n': 'foo', 'x': 'spam', 'func_f': {'d': 0}, 'min': {'c': 5}}  )
search(  {'d': 0}  )
None # хотя я ожидал {"c": 5}

ссылка на вопрос


Ответы (1 шт):

Автор решения: Danis

возвращать значение надо лишь в том случае если функция что то нашла

d={'global': {'a': 10, 'b': 4, 'func': {'n': "foo", 'x': 'spam', 'func_f': {"d": 0}, 'min': {"c": 5}} }}
def search(d, skey):
    print("search(  %s  )" % d)
    for i in d:
        if i==skey:
            print("return %s" % d[i])
            return d[i]
        else:
            if type(d[i])==dict:
                res = search(d[i], skey)
                if res != None:
                    return res

print(search(d, 'func_f'))

print(search(d, 'min'))
→ Ссылка