如何使用递归函数找到最大元素的索引?

时间:2015-12-26 13:37:20

标签: python recursion

对于赋值,我必须递归地找到最大元素的索引。我怎么能这样做?

我已尝试过以下功能,但我的结果一直不正确:

def maxElement(A):
    if len(A)==1:
        return A[0]
    else:
        max=maxElement(A[1:])
        if A[0]>max:
            return A[0]
        else:          
            return max


A=[9, 16, 100, 36, 4, 25, 1, 81, 49, 9, 64]
print(maxElement(A))

我应该2,因为它是第三个元素,但我不断获得100

3 个答案:

答案 0 :(得分:1)

简单的方法是使用maxindex作为@Harwee显示,但您也可以使用此递归函数执行此操作

def find_max_pos(lista,pos=0,pos_item=None) -> "(index,item)":
    if not lista:
        return pos_item
    else:
        item  = lista[0]
        resto = lista[1:]
        if pos_item is None:
            return find_max_pos(resto,pos+1,(pos,item))
        prev = pos_item[1]
        if prev >= item:
            return find_max_pos(resto,pos+1,pos_item)
        else:
            return find_max_pos(resto,pos+1, (pos,item) )

使用pos参数跟踪当前位置,使用pos_item跟踪最大项目及其位置,基本情况为空列表,如果您返回的是并且在每次迭代中减少列表,您可以对其进行修改,这样您就不会继续使用其他参数max_pos复制列表

def find_max_pos_v2(lista,pos=0,pos_item=None,max_pos=None) -> "(index,item)":
    if max_pos is None:
        max_pos = len(lista)
    if pos >= max_pos:
        return pos_item
    item  = lista[pos]
    if pos_item is None:
        return find_max_pos_v2(lista,pos+1,(pos,item),max_pos)
    prev = pos_item[1]
    if prev >= item:
        return find_max_pos_v2(lista,pos+1,pos_item,max_pos)
    else:
        return find_max_pos_v2(lista,pos+1,(pos,item),max_pos )

如果您只希望position或max元素相应地修改pos_item的使用。

请注意,我将所有其他参数默认为一些方便的值,然后相应处理。

例如

>>> A=[9, 16, 100, 36, 4, 25, 1, 81, 49, 9, 64]
>>> find_max_pos(A)
(2, 100)
>>> find_max_pos_v2(A)
(2, 100)
>>> 

答案 1 :(得分:0)

我不知道你的意思 类似于此的事情将完成这项工作

A=[9, 16, 100, 36, 4, 25, 1, 81, 49, 9, 64]
x  = max(A)
print A.index(x)

答案 2 :(得分:0)

你需要随时跟踪其索引的最大元素和当前索引,返回max元素的索引:

def max_ind(l, i, mx, mx_i):
    if not l:
        return mx_i
    if l[0] > mx:
        mx = l[0]
        mx_i = i
    i += 1
    return max_ind(l[1:], i, mx, mx_i)


l = [9, 16, 100, 36, 4, 25, 1, 81, 49, 9, 64]
print(max_ind(l, 0, l[0], 0))
2

如果你想要元素和索引:

def max_ind(l, i, mx, mx_i):
    if not l:
        return mx_i, mx
    if l[0] > mx:
        mx = l[0]
        mx_i = i
    i += 1
    return max_ind(l[1:], i, mx, mx_i)


l = [9, 16, 100, 36, 4, 25, 1, 81, 49, 9, 64]
print(max_ind(l, 0, l[0], 0))
(2, 100)

您也可以在不切片的情况下执行此操作:

def max_ind(l, mx, i, mx_i):
    if not l.__length_hint__():
        return mx_i
    e = next(l)
    if e > mx:
        mx = e
        mx_i = i
    i += 1
    return max_ind(l, mx, i, mx_i)


l = [9, 16, 100, 36, 4, 25, 1, 81, 49, 9, 64]
print(max_ind(iter(l), l[0], 0, 0))