我试图了解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 )
答案 0 :(得分:0)
这是一个递归函数,因此对于收敛到您的解决方案的解决方案(如果它确实存在于列表中,否则函数返回-1
)它将需要不断地使用它的当前{{ 1}},data
和criteria
(自第一次调用first
以来没有更改过),它是findData()
的新值。 last
的新值在递归函数内不断更新为last
或mid+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
当然。递归函数没有魔力。与调用函数的所有函数一样,它等待它返回以恢复自己的执行。被调用的函数恰好相同的事实并不重要。绑定参数和局部变量将是每个调用的本地变量,因此它们不会泄漏,每个调用都会返回到前一个调用。没有任何魔法。可能是每次都提供相同功能的不同功能。