0

たとえば、リスト内のアイテムの注文番号を見つけようとしています:

lst = [ a, b, [c,d], e, f]

order([c,d]) = 2
order('e') = 3

私はこのように考えています:

def order(item,lst):
    if lst[0] == item:
       return n
    else:
       return order(item,lst[0:])

ただし、エラーが発生します(関連する再帰の深さ)。私のせいは何ですか?またはどうすればできますか?

4

4 に答える 4

6

なぜ使用しないの.index()ですか?

In [1]: l = [ a, b, [c,d], e, f]
In [2]: l.index([c,d])
Out[2]: 2
In [4]: l.index(e)
Out[4]: 3

再帰関数が本当に必要な場合は、次を使用します。

def order(item, l, n=0):
    if l:
        if l[0] == item:
            return n
        elif len(l) >= 2: # for python 2, use "else:"
            return order(item, l[1:], n+1)

また、再帰が必須ではないが を使用できない場合.index()は、for ループを使用します。

def order(item, l):
    for i,v in enumrate(l):
        if v == item:
            return i

どちらの方法でも、呼び出すだけですorder([c,d], lst)

于 2013-01-20T12:26:18.093 に答える
1
def order(item, lst,n=0):
    if not lst:
        return None
    elif lst[0] == item:
        return n
    else:
        return order(item, lst[1:],n+1)

lst = ['a', 'b', ['c', 'd'], 'e', 'f']

order(['c', 'd'], lst)

アウト:

2
于 2013-01-20T12:23:49.437 に答える
1
  1. 関数は基本ケースで n を返しますが、何も割り当てません。探しているものが最初の要素にある場合は、0 を返す必要があります。
  2. あなたの再帰ケースはリスト全体を渡します。そのため、再帰は決して終了しません。lst[1:] を渡すと、呼び出しごとにリストが小さくなりますが、結果に 1 を追加する必要があります (実際には、再帰呼び出しごとにすべてが 1 桁下にシフトされます)。
于 2013-01-20T12:15:46.350 に答える
-1

Python には、これを行うための組み込み関数があります。

lst = ['a', 'b', ['c', 'd'], 'e', 'f']

assert lst.index(['c', 'd']) == 2
assert lst.index('e') == 3

独自の関数を修正する場合は、ベース ケースが必要です。

def order(item, lst):
    if not lst:
        return None
    elif lst[0] == item:
        return n  # You need to calculate n here. 
                  # I'm not doing your homework for you
    else:
        return order(item, lst[1:])
于 2013-01-20T12:08:30.163 に答える