Python рекурсивно строит список - PullRequest
0 голосов
/ 27 октября 2019

Допустим, у меня есть строка

S = "qwertyu"

И я хочу построить список с использованием рекурсии, чтобы список выглядел как

L = [u, y, t, r, e, w, q]

Я пытался написать код, подобный этому:

 def rec (S):
    if len(S) > 0:
        return [S[-1]].append(rec(S[0:-1]))

В идеале я хочу добавить последний элемент сокращающейся строки до тех пор, пока он не достигнет 0, но все, что я получил в качестве результата, это None

Я знаю, что я делаю это неправильно, иЯ понятия не имею, что вернуть, когда длина S достигает 0, пожалуйста, покажите мне, как я могу сделать эту работу

(извините, ответ должен использовать рекурсию, иначе это не будет беспокоить меня)

Большое спасибо !!!

Ответы [ 4 ]

2 голосов
/ 27 октября 2019

Это самое простое решение:

def rec(S):
    if len(S) == 1:
        return S
    return S[-1] + rec(S[:-1])

Или в одну строку, если вы действительно хотите кого-то впечатлить:)

def rec(S):
    return S if len(S) == 1 else S[-1] + rec(S[:-1])
2 голосов
/ 27 октября 2019

Есть много более простых способов, чем использование рекурсии, но вот один рекурсивный способ сделать это:

def rec (S):
    if not S:
        return []
    else:
        temp = list(S[-1])
        temp.extend(rec(S[:-1]))
        return temp

РЕДАКТИРОВАТЬ:

Обратите внимание, что базовый случай гарантирует, что функция также работает спустой строкой. Мне пришлось использовать temp, потому что вы не можете вернуть list(S[-1]).extend(rec(S[:-1])), потому что это NoneType (это вызов метода, а не объекта). По той же причине вы не можете присвоить переменную (отсюда две отдельные строки с temp). Обходной путь может заключаться в использовании + для объединения двух списков, как предложено в ответе Арьереса (однако я бы советовал против его совета попытаться произвести впечатление на людей с запутанными однострочными линиями):

def rec (S):
    if not S:
        return []
    else:
        return list(S[-1]) + rec(S[:-1])

Фактически использование + может быть более эффективным (хотя улучшение, скорее всего, будет незначительным), см. Ответы на этот вопрос SO для получения более подробной информации.

0 голосов
/ 27 октября 2019

Поскольку append изменяет список, это немного трудно выразить рекурсивно. Один из способов сделать это - использовать отдельную внутреннюю функцию, которая передает текущий L следующему рекурсивному вызову.

def rec(S):
    def go(S, L):
        if len(S) > 0:
            L.append(S[-1])
            return go(S[0:-1], L)
        else:
            return L
    return go(S, [])
0 голосов
/ 27 октября 2019
    L = [i for i in S[::-1]]

Должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...