Одна огромная проблема заключается в приведенном ниже коде: вы вычитаете количество шагов для каждой возможности в пределах диапазона шагов.
n=n-i
res=CSR(n,i,res)
Когда вы закончите изучать, что можно сделать с 1-шаговым прыжком, вам нужно вернуться назад и попробовать с той же начальной точки (исходное значение этого экземпляра n
) с 2-х ступенчатым прыжком. Измените код на:
res = CSR(n-i, i, res)
Это сохраняет значение n
неизменным при прохождении цикла.
Кроме того, вы не можете ограничивать будущие прыжки максимумом того, что вы только что сделали. Измените и этот второй параметр:
res = CSR(n-i, k, res)
Это должно заставить вас двигаться. Также попробуйте этот замечательный блог debug, чтобы получить помощь. По крайней мере, вставьте один или два оператора трассировки, например
print n, k, res
на вершине вашей рутины.
CAVEAT
Это не все твои беды. Самая большая оставшаяся проблема заключается в том, что CSR
возвращает только одно решение: каждый сделанный вами шаг добавляется в тот же список. Вам нужен способ собрать готовые решения в отдельные списки; append
в climbingStaircase
выполняется только один раз после полного завершения CSR
.
Вы должны узнать законченное решение на n==0
.
ПОМОЩЬ ПО ОТЛАДКЕ
Вот версия вашей программы с исправленными параметрами рекурсии и вставленными трассировками отладки.
indent = ""
def climbingStaircase(n, k):
final_res = []
final_res.append(CSR(n, k, []))
return final_res
def CSR(n, k, res):
global indent
indent += " "
print indent, n, k, res
if n == 0:
print "SOLUTION", res
else:
for i in range(1, k+1):
if n-i >= 0:
CSR(n-i, k, res + [i])
indent = indent[:-2]
print climbingStaircase(4, 2)
Обратите внимание на использование «отступа», чтобы помочь визуализировать рекурсию и возврат. Важным моментом здесь является то, что вместо глобального обновления res
я оставил его как локальную переменную. Я также удалил возвращаемое значение, просто сбросив его, чтобы вывести решения в том виде, в каком они были найдены. Вы можете увидеть, как это работает:
4 2 []
3 2 [1]
2 2 [1, 1]
1 2 [1, 1, 1]
0 2 [1, 1, 1, 1]
SOLUTION [1, 1, 1, 1]
0 2 [1, 1, 2]
SOLUTION [1, 1, 2]
1 2 [1, 2]
0 2 [1, 2, 1]
SOLUTION [1, 2, 1]
2 2 [2]
1 2 [2, 1]
0 2 [2, 1, 1]
SOLUTION [2, 1, 1]
0 2 [2, 2]
SOLUTION [2, 2]
[None]
Я надеюсь, что с этим материалом вы сможете проследить свою логику и выяснить, как зафиксировать последовательность решений на выбранном вами уровне.
person
Prune
schedule
26.07.2017