Почему этот код Python отображает ошибку TypeError при хранении суммы индекса кэша? - PullRequest
0 голосов
/ 10 февраля 2019

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

Насколько я понял, это из блогов Daily Programming Challenges , говорящих о том, каконо работает.Фрагмент кода, который они используют, - это Pythonic, используя понимание списка.Я уже выполнил свою часть, но я хотел сравнить, как их решение может быть лучше моего, используя функцию sum и взяв дополнительную переменную в аргументе функции.

Вот сводка: КаждоеКэш записей [i] будет содержать количество способов, которыми мы можем добраться до шага i с набором X. Затем мы построим массив с нуля, используя ту же повторяемость, что и раньше:

Этоэто их пример кода

def staircase(n, X):
    cache = [0 for _ in range(n + 1)]
    cache[0] = 1
    for i in range(n + 1):
        cache[i] += sum(cache[i - x] for x in X if i - x > 0)
        cache[i] += 1 if i in X else 0
    return cache[-1]

Это мой пример кода:

def staircase_dp(n):

    dp = [0 for i in range(n + 1)]

    dp[0] = 1
    dp[1] = 1
    for i in range(2, n + 1):
        val = dp[i - 1] + dp[i - 2]
        dp.insert(i, val)
    return dp[n]

Это мой основной код:

if __name__ == '__main__':
    steps = 6
    n = 2

    print("Number of ways to use the stairs = {0}".format(staircase(steps, n))) #This will use the example from Daily Programming Challenge and gives TypeError message.
    print("Number of ways to use the stairs = {0}".format(staircase_dp(steps))) #Mine which outputs 13

Для их примера, когда я пытаюсьраспечатайте его, и вы получите сообщение TypeError:

`Traceback (most recent call last):
  File "staircase.py", line 44, in <module>
    print("Number of ways to use the stairs = {0}".format(staircase_dp(steps, n)))
  File "staircase.py", line 21, in staircase_dp
    cache[i] = sum(cache[i - x] for x in X if i - x > 0)
TypeError: 'int' object is not iterable`

Однако для моего решения я просто создаю динамический массив от 0 до n.Как мы знаем, dp [0] и d [1] всегда будут давать значение 1. После второй итерации мы начнем вычислять большие числа и добавим их в другую переменную, которая содержит значения dp[i - 1] + dp[i - 2].Затем вставьте значение в стек dp, который мы потом вернем.

Что я не совсем понимаю, потому что я просто пытаюсь добавить количество вычисленных шагов, выполненных вкеш и просто вернуть мне значение кеша.Это правильное мышление?

1 Ответ

0 голосов
/ 10 февраля 2019

X, который вы передали функции staircase в качестве второго аргумента, является int (2).

Это:

steps = 6
n = 2
...
staircase(steps, n)

означает, чтовнутри staircase функция X равна 2.Это, в свою очередь, означает, что генератор в строке, указанной в вашей обратной трассировке (cache[i] += sum(cache[i - x] for x in X if i - x > 0)), будет пытаться получить значения для x из (итерировать) X.Чтобы сосредоточиться именно на этой самой проблеме, мы можем уменьшить строку до (это взято из вашего примера выше, просто отбрасывая синтаксический пух, не относящийся к насущной проблеме):

(x for x in 2)

Что будет поднимать то же самоеисключение, так как мы не можем перебрать духовку int.Вы не можете сделать что-то для каждого x в 2 (int), поскольку у него нет итератора (и на самом деле нет значимых элементов для итерации), следовательно, исключение TypeError.

Другими словами: вы, вероятно, либо хотели перебрать что-то еще в этом генераторе.Или передайте что-нибудь еще (итерируемое) в staircase в качестве второго аргумента.

...