函数调用self与return语句有效......但为什么呢?

时间:2018-03-02 22:08:24

标签: python sorting recursion

我试图了解Python,过去只用Java编写过。如果有人可以提供帮助,我需要一些帮助来理解一些代码,或者指向一个好(简单)资源的方向吗?

我在Python中用一些伪代码编写了一个二进制排序,它可以工作,但我不明白怎么做。如果下面的代码在行上没有返回语句,那么该函数对我有意义:

return findData( data, criteria, first, mid -1 ) 

或者,如果我设置了一个while循环,并根据我需要引用的列表的哪一半修改了开始或结束索引变量。

但是使用这段代码我不知道函数返回的位置,或者如果删除它们代码失败的原因?有意义的是,我返回-1,因为没有匹配和' mid'引用匹配的列表位置,但是返回语句传递数据,条件,第一个和最后一个应该会导致语法错误,因为没有调用这样的函数?

提前感谢任何能够解释我所写作品如何运作的人。我的代码如下。

Mr.D

# Binary Search

def findData( data, criteria, first, last ):

    if( last < first ):
        return -1

    else:
        mid = ( last + first ) // 2

        if( criteria == data[mid] ):
            return mid

        elif ( criteria > data[mid] ):
            print( "Currently looking at", data[mid], "in array poition", mid )
            return findData( data, criteria, mid +1, last )

        elif( criteria < data[mid] ):
            print( "Currently looking at", data[mid], "in array poition", mid )
            return findData( data, criteria, first, mid -1 )


Data = [15, 21, 29, 32, 37, 40, 42, 43, 48, 50, 60, 64, 77, 81, 90, 98]
Criteria = 98
Location = -1

Location = findData( Data, Criteria, 0, len( Data ) -1 )

if( Location < 0 ):
    print( Criteria, "is not located in the array." )
else:        
    print( Criteria, "is located in array position ", Location )

2 个答案:

答案 0 :(得分:0)

这是一个递归函数,因此对于收敛到您的解决方案的解决方案(如果它确实存在于列表中,否则函数返回-1)它将需要不断地使用它的当前{{ 1}},datacriteria(自第一次调用first以来没有更改过),它是findData()的新值。 last的新值在递归函数内不断更新为lastmid+1,直到mid-1,此时返回criteria==data[mid]的索引作为criteria并设置为变量mid

答案 1 :(得分:0)

return -1

这意味着评估表达式-1并将结果作为此函数的结果返回。

return mid + 1

这意味着评估表达式mid + 1并将结果作为此函数的结果返回。

return findData( data, criteria, first, mid -1 ) 

这意味着计算表达式findData( data, criteria, first, mid -1 ),这意味着再次使用已计算的参数调用函数findData,并将结果作为此函数的结果返回。这不会返回功能。你实际上可以像这样分开它:

Location = findData( data, criteria, first, mid -1 ) 
return Location

这完全一样。第一行正是您在第一时间调用该函数所做的工作。

现在,如果你调用一个函数并且不使用它的返回值,它就是死代码。想象一下这段代码:

def test(n):
  somefun(n)

test(5) # ==> None

现在,如果您返回somefun的结果,则test将成为somefun的别名。

如果你想返回一个函数,你不会使用parens和参数来应用它:

return findData    # returns a fucntion by name
return lambda v: v # return a lambda function

当然。递归函数没有魔力。与调用函数的所有函数一样,它等待它返回以恢复自己的执行。被调用的函数恰好相同的事实并不重要。绑定参数和局部变量将是每个调用的本地变量,因此它们不会泄漏,每个调用都会返回到前一个调用。没有任何魔法。可能是每次都提供相同功能的不同功能。