Название говорит о большей части проблемы. МЫ ОБЯЗАНЫ НАПИСАТЬ ЭТО РЕКУРСИВНО . Нам дают список президентов:

    preslst=[['George Washington',1732,1788],['John Adams',1735,1796],['Thomas Jefferson',1743,1800],['James Madison',1751,1808],
     ['James Monroe',1758,1816],['John Quincy Adams',1767,1824],['Andrew Jackson',1767,1828],['Martin Van Buren',1782,1836],
     ['William Henry Harrison',1773,1840],['John Tyler',1790,1840],['James K. Polk',1795,1844],['Zachary Taylor',1784,1848],
  ['Millard Fillmore',1800,1850],['Franklin Pierce',1804,1858],['James Buchanan',1791,1857],['Abraham Lincoln',1809,1861],
     ['Andrew Johnson',1808,1865],['Ulysses S. Grant',1822,1869],['Rutherford B. Hayes',1822,1877],['James A. Garfield',1831,1881],
     ['Chester A. Arthur',1829,1881],['Grover Cleveland',1837,1885],['Benjamin Harrison',1833,1889],['Grover Cleveland',1837,1893],
     ['William McKinley',1843,1897],['Theodore Roosevelt',1858,1901],['William Howard Taft',1857,1909],['Woodrow Wilson',1856,1913],
     ['Warren G. Harding',1865,1921],['Calvin Coolidge',1872,1923],['Herbert Hoover',1874,1929],['Franklin D. Roosevelt',1882,1933],
     ['Harry S. Truman',1884,1945],['Dwight D. Eisenhower',1890,1953],['John F. Kennedy',1917,1961],['Lyndon B. Johnson',1908,1963],
     ['Richard M. Nixon',1913,1969],['Gerald Ford',1913,1974],['Jimmy Carter',1924,1977],['Ronald Reagan',1911,1981],
     ['George H. Bush',1924,1989],['Bill Clinton',1946,1993],['George H.W. Bush',1946,2001],['Barack Obama',1961,2009],
     ['Donald Trump',1946,2017]]

Нас просят определить функцию (arg1 = имя президента, отформатированное в списке, arg2 = preslst), которая будет рекурсивно проходить по списку и возвращать индексную позицию списка, содержащего правильное имя.

Вот что у меня сейчас:

def presPosition(pres,preslst):
    for i in range(0,len(preslst)):
        print('search')
        presname = preslst[i][0]

        if presname ==  pres:
            print("FOUND")
            foundpres = preslst[0]
            return preslst.index(foundpres)

        else:
            return presPosition(pres,preslst[1:]) 

Например: presPosition ('John Adams', preslst) возвращаемое значение должно быть 1.

Я продолжаю получать 0 в качестве возвращаемого значения, и я понимаю, почему, так как первая передача в операторе else будет иметь имя, которое я ищу, как первый элемент в переданном списке. Итак, как мне получить функцию, возвращающую позицию в исходном списке?

Заранее спасибо.

0
delamikeii 27 Фев 2018 в 07:06

4 ответа

Лучший ответ

Вы получаете 0, потому что после каждой итерации вы переходите preslst[1:] к следующей итерации. И вы возвращаете preslst.index(foundpres), который находится в приведенном выше списке и всегда является 0-м индексом.

Вместо этого я предлагаю следовать.

def presPosition(pres,preslst, next_index=0):
    print('search')
    if next_index == len(preslst):
        print("NOT FOUND")
        return

    presobj = preslst[next_index]
    presname = presobj[0]

    if presname ==  pres:
        print("FOUND")
        return preslst.index(presobj)    # return next_index

    else:
        return presPosition(pres,preslst, next_index+1)
0
Chamath 27 Фев 2018 в 05:10

Это странное упражнение и определенно не подходит для рекурсии. Тем не менее, вот что вы могли бы сделать. Верните длину списка, когда вы найдете элемент, и в конце вы вычтите его из размера исходного списка:

def presPosition(pres,preslst):
    print('search')
    presname = preslst[0][0]

    if presname ==  pres:
        print("FOUND")
        return len(preslst)

    else:
        return presPosition(pres,preslst[1:])

preslst = [...] # your list
print(len(preslst) - presPosition('James Madison', preslst)) # outputs 3

Кстати, вам не нужен цикл for, поскольку вы используете только первый элемент, а затем возвращаете его, поэтому я удалил его.

0
damores 27 Фев 2018 в 04:29

Попробуйте следующее, если вам нужна рекурсия.

def presPosition(pres, preslst, i=0):
    if i == len(preslst):
        return "Pres Not Found!"

    if preslst[i][0] == pres:
        return i
    else:

        return presPosition(pres, preslst, i+=1)

В вашем коде вы удаляете первый элемент, поэтому ваш индекс всегда будет 0.

0
Rahul 27 Фев 2018 в 07:17

Вот как это сделать с enumerate() и for-loop:

 def myFunc(pname, plist)    
    presname = pname
    preslist = plist
    for index, tup in enumerate(plist):
        if tup[0] == pname:
            return index
        raise ValueError('value not found in list')
0
kale 27 Фев 2018 в 04:55