当前位置: 首页 > 知识库问答 >
问题:

java或python中某个范围的递归max函数

葛鸿轩
2023-03-14

我从“思考java,如何像计算机科学家一样思考”中得到了这个练习。艾伦·B·唐尼:

编写一个名为maxInRange的方法,该方法采用一个整数数组和一系列索引(lowIndexandHighIndex),并在数组中找到最大值,仅考虑lowIndexHighIndex之间的元素,包括两端。

此方法应该是递归的。如果范围的长度为1,也就是说,如果低索引==高索引,我们立即知道范围中的唯一元素必须是最大值。这就是基本情况。

如果范围中有多个元素,我们可以将数组分成两部分,在每个部分中找到最大值,然后找到最大值的最大值。

我用python给出了一个接近但非常不准确的答案:

cycles=0

def max_in_range(lst,low,high):

    '''

    Could not be able to make it work correctly

    '''



    global cycles

    cycles+=1

    if low==high:

        #print "Cycles: ",cycles

        return lst

    else:

        max_left=max_in_range(lst[low:len(lst)/2+1],low+1,high)

        max_right=max_in_range(lst[len(lst)/2:len(lst)],low+1,high)

        return max_right if max_right>max_left else max_left



lst=[112,32,45,71238,9999,45,12,6,3]   # always Returns the mid element.

print max_in_range(lst,0,10)



def max(lst):

    global cycles

    cycles+=1

    if len(lst)==1:

        print "Cycles: ",cycles

        return lst[0]

    else:

        m=max(lst[1:])

        return m if m> lst[0] else lst[0]



print max(lst)

与问题所要求的功能相比,max函数非常简单,即函数是递归的,在运行时接受两个限制并拆分列表。函数始终返回数组中的中间元素,即9999

我需要一些关于如何满足问题要求的建议。在Java或Python或任何其他类似C的语言中。

共有2个答案

司徒泰
2023-03-14

您需要将电话更改为:

print max_in_range(lst,0,len(lst))

这样就不会像示例那样溢出数组。

但其余部分应该是这样的:

split = low + ((high - low) / 2)

max_left  = max_in_range(lst, low, split - 1)
max_right = max_in_range(lst, split, high)
元英朗
2023-03-14

请参见代码中的注释。

def max_in_range(lst, low, high):
    # If the length of the range is 1, the sole element in the range must be the maximum.
    if low == high:
        return lst[low]

    # break the array into two pieces, lst[low:low+1] / lst[low+1:high+1],
    # find the maximum in each of the pieces
    piece1_max = lst[low]
    piece2_max = max_in_range(lst, low + 1, high)

    # find the maximum of the maxima
    if piece1_max > piece2_max:
        return piece1_max
    else:
        return piece2_max

lst = [112,32,45,71238,9999,45,12,6,3]
print max_in_range(lst, 0, len(lst) - 1)
 类似资料:
  • 考虑Python中的这个基本递归: 根据斐波那契数列的(n-1)(n-2)函数,这是有道理的。 Python如何执行包含另一个递归的递归,这个递归不在同一代码行内,而是在同一代码行内?“finobacci(number-1)”是否完成所有递归,直到它到达“1”,然后它对“fibonacci(number-2)”做同样的事情,并将它们相加? 作为比较,下面的递归函数将一个数“x”提升为“y”的幂,我

  • 我试图在Python中做一个函数,它接受树的任意节点,并根据节点给出的列表填充列表。 考虑到以下绘制糟糕的树: 例如,如果我们从节点5开始,我们应该得到: 包含具有相同父节点的所有节点的列表,包括我们从(4和5)开始的节点。 任何子节点,但不是其子节点(6) 父节点和具有相同父节点的任何父节点,以及它们的父节点,等等,直到我们到达根节点,但不包括根节点(在本例中只有2和3个,但如果树更深,我们开始

  • 我在递归地计算一个数的位数和,直到和小于10。例如; 由于最后的数字和是9,那么我们停止。我意识到遵循递归方法,在我的知识中,它工作得很好; 但是,如果我们有类似的情况,正确的输出是1,因为但是我的代码停止在第二个级别,并以我可以得到一些帮助来修改我的第二个代码以解决这个问题吗?提前谢了。

  • 我还不太理解递归,我有一些作业我不能解决。有人有主意吗? 任务1:实现一个int方法max(int[]arr,int i),该方法返回arr中所有元素的最大值和索引 这是我迄今为止的代码: 实际上它是有效的,但它的风格很差,所以我的问题是:如果没有私有静态int max,我如何实现递归方法?我不允许向该方法添加第三个参数。 任务2:实现一个布尔方法包含值(int[]arr,int val),如果a

  • 问题内容: 我看过很多文章,解释了这个问题,但是他们都使用整数值,老实说,我并没有完全理解它,所以这个问题: 我正在尝试在Java中生成从(-1554900.101)到(52952058699.3098)范围的随机数,我想知道是否有人可以向我解释这一点,因为我真的很想理解它。 我的想法:这是正确的方法吗?1)生成一个在我指定范围内的随机整数2)将生成的数除以pi以得到float / double随

  • 问题内容: 是否可以通过某种方式将一个函数的范围传递给另一个函数? 例如, 我宁愿直接访问变量,即,不使用类似或的任何东西,而只是直接使用或。 问题答案: 真正访问函数私有范围的唯一方法是在函数内部声明,这样就形成了一个闭包,允许隐式访问变量。 这是您的一些选择。 直接访问 在内部声明。 如果您不想在中使用,则可以将它们都放在更大的容器范围内: 这些是您可以直接使用的变量而无需任何额外的代码来移动