Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么可以';我是否将默认参数设置为递归二进制搜索函数?_Python_Algorithm_Data Structures_Binary Search - Fatal编程技术网

Python 为什么可以';我是否将默认参数设置为递归二进制搜索函数?

Python 为什么可以';我是否将默认参数设置为递归二进制搜索函数?,python,algorithm,data-structures,binary-search,Python,Algorithm,Data Structures,Binary Search,我正在读一本关于Python中的数据结构和算法的书,其中包含了一个二进制搜索函数的示例,我意识到了一些东西……该函数需要4个参数,但最后两个参数总是相同的,即low=0和high=len(数据)。为什么我不能将它们设置为默认参数 这里的主要问题是,设置low=0是可以的,但high=len(数据)将引发错误,因为显然在分配值之前正在访问数据列表。那么,函数本身是否有办法获得低值和高值,这样我就不必将它们作为参数传递给主调用(因为递归仍然需要它们) def二进制搜索(数据、目标、低、高): “”“

我正在读一本关于Python中的数据结构和算法的书,其中包含了一个二进制搜索函数的示例,我意识到了一些东西……该函数需要4个参数,但最后两个参数总是相同的,即low=0和high=len(数据)。为什么我不能将它们设置为默认参数

这里的主要问题是,设置low=0是可以的,但high=len(数据)将引发错误,因为显然在分配值之前正在访问数据列表。那么,函数本身是否有办法获得低值和高值,这样我就不必将它们作为参数传递给主调用(因为递归仍然需要它们)

def二进制搜索(数据、目标、低、高):
“”“如果在列表的指定部分找到目标,则返回True
搜索只考虑从数据[low]到数据[high]的部分
如果低>高:
返回错误
其他:
中=(低+高)//2
如果目标==数据[mid]:
返回真值
elif目标<数据[mid]:
#在中间的左侧部分重复出现
返回二进制搜索(数据、目标、低、中1)
其他:
#在中间部分的右侧重复出现
返回二进制搜索(数据、目标、中+1、高)
arr=[k+1表示范围内的k(10000)]
二进制搜索(arr,4590,0,len(arr))

是的,在这里设置默认参数值是有意义的

因为这是从一本试图教你一些关于数据结构的书中得到的,我想他们忽略了这一点,以便更容易理解

在编写时,您无法知道默认的
high
应该是什么,但您不必知道。只需使用
None
即可-这是一个很好的默认设置:

def binary_search(data, target, low=0, high=None):
    """If target is found in indicated portion of a list, returns True
    The search only considers the portion from data[low] to data[high] inclusive."""

    if high is None:
        high = len(data)

    # the rest remains the same

然后将low和high设置为全局变量:)通常我通过为客户机代码提供一个前端函数,然后是一个递归的内部细节函数来解决这个问题。但您可以按自己的方式默认设置为“高=无”,在代码集中,“如果高为无:高=长(数据)”
low
high
并不总是相同的值。当您递归到函数中时,您正在更改它们,例如
返回二进制搜索(data,target,low,mid-1)
返回二进制搜索(data,target,mid+1,high)
。我应该仔细阅读。@TomDalton很抱歉,我应该更好地表达我自己,主调用99%的时间都会有相同的最后两个参数,而递归调用实际上是不同的。工作起来很有魅力,这对其他递归问题也很有用。非常感谢。
def binary_search(data, target, low=0, high=None):
    """If target is found in indicated portion of a list, returns True
    The search only considers the portion from data[low] to data[high] inclusive."""

    if high is None:
        high = len(data)

    # the rest remains the same