Может ли типичный диалект Lisp решить проблемы, используя снизу вверх "динамическое программирование" ?
(Обратите внимание: я не говорю о "memoization", который, насколько я понимаю, тривиально, используя любой диалект Lisp. Я действительно говорю о восходящем динамическом программировании, где вы строите, для пример, ваш массив снизу вверх, а затем используйте только что введенные элементы для вычисления следующих.)
Например, используя динамическое программирование, проблема "0-1 рюкзак" может быть решена в псевдополиномиальном времени для входов, на которые сбой любого другого метода.
Необходимым (неполным) решением является:
for (int k = 1; k <= a.length; k++) {
for (int y = 1; y <= b; y++) {
if (y < a[k-1]) {
knap[k][y-1] = knap[k-1][y-1];
} else {
if (y > a[k-1]) {
knap[k][y-1] = Math.max(knap[k-1][y-1], knap[k-1][y-1-a[k-1]] + c[k-1]);
} else {
knap[k][y-1] = Math.max(knap[k-1][y-1], c[k-1]);
}
}
Можно ли это сделать в различных диалектах Lisp? Если нет, почему бы и нет?