При обработке вашего действия вы возвращаете объект (проверяйте фигурные скобки):
return {
...state,
sidebarname: action.payload
};
Поскольку ваше полное состояние - это только строка sidebarname
, вы должны вернуть только полезную нагрузку:
return action.payload
В качестве альтернативы вы можете указать свое состояние как объект, а затем действие вашего действия должно работать нормально:
let initialState = { sidebarmenu: "wrapper slide-menu" };
...
export default function(state=initialState,action){
...
}
helper
можно вызывать с другим параметром value
для одного и того же index
. Таким образом, value
должно быть удалено (вычтено из сохраненного max_dict
). Один из способов сделать это - добавить value
непосредственно перед возвращением, а не раньше:
money = [2, 1, 1, 2]
max_dict = {}
def helper(value, index):
if index in max_dict:
return value + max_dict[index]
elif index >= len(money):
return value
else:
option1 = money[index]
new_index1 = index + 2
option2 = 0
new_index2 = index + 1
max_dict[index] = max(helper(option1, new_index1), helper(option2, new_index2))
return value + max_dict[index]
helper(0, 0)
Более подробное объяснение того, что происходит, дается в ответе @ ggorlen
. Ваш подход к запоминанию не будет работать, потому что, когда вы достигнете некоторого индекса i
, если вы уже вычислили какой-то результат для i
, ваш алгоритм не учитывает тот факт, что может быть лучше Результат можно получить, ограбив более оптимальный набор домов в левой части массива.
Решение этой дилеммы состоит в том, чтобы не пропускать бегущую value
(деньги, которые вы ограбили) вниз через рекурсивные звонки от родителей к детям. Идея состоит в том, чтобы вычислить результаты подзадачи без какого-либо ввода от узлов-предков, а затем построить более крупные решения из меньших по пути к стеку вызовов.
Затем будет работать запоминание индекса i
, поскольку данный индекс i
всегда будет иметь уникальный набор подзадач, решения которых не будут искажены при выборе из предков в левой части массива. Это сохраняет оптимальную подструктуру, необходимую для работы DP.
Кроме того, я рекомендую избегать глобальных переменных в пользу передачи ваших данных непосредственно в функцию.
def maximize_robberies(houses, memo, i=0):
if i in memo:
return memo[i]
elif i >= len(houses):
return 0
memo[i] = max(
houses[i] + maximize_robberies(houses, memo, i + 2),
maximize_robberies(houses, memo, i + 1)
)
return memo[i]
print(maximize_robberies([1, 2, 1, 1], {}))