我从“思考java,如何像计算机科学家一样思考”中得到了这个练习。艾伦·B·唐尼:
编写一个名为maxInRange
的方法,该方法采用一个整数数组和一系列索引(lowIndex
andHighIndex
),并在数组中找到最大值,仅考虑lowIndex
和HighIndex
之间的元素,包括两端。
此方法应该是递归的。如果范围的长度为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的语言中。
您需要将电话更改为:
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)
请参见代码中的注释。
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随
问题内容: 是否可以通过某种方式将一个函数的范围传递给另一个函数? 例如, 我宁愿直接访问变量,即,不使用类似或的任何东西,而只是直接使用或。 问题答案: 真正访问函数私有范围的唯一方法是在函数内部声明,这样就形成了一个闭包,允许隐式访问变量。 这是您的一些选择。 直接访问 在内部声明。 如果您不想在中使用,则可以将它们都放在更大的容器范围内: 这些是您可以直接使用的变量而无需任何额外的代码来移动