Python返回值

时间:2015-12-11 02:03:19

标签: python-2.7

我写了一个bisect函数,它带有一个单词列表" t"和一个词" val"。它递归地将列表减半,直到列表的索引为单词或返回false。如果它找到了这个词,它应该返回它。

我在这里阅读了多本书,文档和所有适用的问题,但我仍然无法确定我做错了什么:为什么该函数不会返回值?它会打印正常的值,但除了None之外没有返回。

非常感谢任何帮助!

def bisect(t, val):
    if t[len(t)/2] < val and len(t) > 1:
        t = t[len(t)/2:]
        bisect(t, val)
    elif t[len(t)/2] > val and len(t) > 1:
        t = t[:len(t)/2]
        bisect(t, val)
    elif t[len(t)/2] == val:
        t = t[len(t)/2]
        #print type(t), t
        return t
    else:
        return False

b = make_list(t)
x = bisect(b, 'and')
print x

2 个答案:

答案 0 :(得分:1)

这里的主要问题是你需要从每次调用返回t到递归调用的函数。使用下面的修改代码描绘调用堆栈:

def main():
    b = ['a', 'able', 'ability', 'abort', 'and', 'arc', 'zygote']
    x = bisect(b, 'and')
    print x



def bisect(t, val):
    if t[len(t)/2] < val and len(t) > 1:
        t = t[len(t)/2:]
        t = bisect(t, val)
    elif t[len(t)/2] > val and len(t) > 1:
        t = t[:len(t)/2]
        t = bisect(t, val)
    elif t[len(t)/2] == val:
        t = t[len(t)/2]
        print type(t), t
    else:
        return False

    return t

if __name__ == '__main__':
    main()

第一次调用bisect时,t设置为['abort', 'and', 'arc', 'zygote']。 在第二次调用bisect时,t设置为['abort', 'and'] 在第三次调用时,我们找到'and',并返回该值。

IF 你按原样返回(仅从完全匹配或False结果返回),然后返回第二个调用(['abort', 'and']),然后是第一个调用({{ 1}}),最后在第一次调用中返回而不点击['abort', 'and', 'arc', 'zygote'] 。因此,没有任何回报。

像我一样重写原始代码,在找到匹配项之前一切都是一样的。但是,使用我的代码,最后一次调用会将return t返回到第二次调用中使用的t变量。它将值返回给第一个调用,它将结果返回给调用代码。

希望这能解决你的问题。

答案 1 :(得分:0)

此修改版本有效:

def bisect(t, val):
    mid = len(t)//2
    mid_ele = t[mid]
    end = len(t)
    if mid_ele < val and end > 1:
        t = t[mid:]
        return bisect(t, val)
    elif mid_ele > val and end > 1:
        t = t[:mid]
        return bisect(t, val)
    elif mid_ele == val:
        t = mid_ele
        return t
    else:
        return False

b = ['she', 'he', 'you', 'and', 'me']
print(bisect(b, 'and'))

打印所需的:

and

我使用//进行整数除法的Python 3证明,并在递归调用之前添加了两个returns