Давайте начнем с рекурсии последней рекурсивной l oop вызова makeCmbs
cmbs = makeCmbs(cmbs, append(nums, num), remains[i+1:], k-1)
As остается [i + 1:], где значение i в конце l oop будет самым высоким то есть
i = len(remains-1)
Таким образом, это означает, что i+1
на два (2) больше, чем len(remains-1)
, поэтому remain[i+1]
будет пустым array ([])
для первых двух последних раундов повторного получения.
Вот как это работает. Я надеюсь, что добрался до творческой высоты этой проблемы.
ОБНОВЛЕНИЕ:
Впервые, когда k=0
start of function: num:[1 2 3 4] cmbs:[] remains:[5], k:0
Итак, if k=0
условие true
if k == 0 {
cmbs = append(cmbs, nums)
fmt.Printf("in side if: num:%d cmbs:%v k:%v\n", nums, cmbs, k)
return cmbs
}
, то есть первое возвращение рекурсии
как cmbs = [] и nums = [1 2 3 4]
cmbs = append(cmbs, nums)
Теперь перенастроенное значение равно cmb, если условие [[1 2 3 4]] для l oop эта строка
cmbs = makeCmbs(cmbs, append(nums, num), remains[i+1:], k-1)
и здесь l oop заканчивается, поэтому она также возвращает то же самое
[[1 2 3 4]]
Но в до этого к рекурсии добавлялись nums + num + num, то есть [1 2 3 5]
, поэтому, когда он возвращается во второй последней рекурсии, то же самое для l oop вызовов cmbs удерживают [1 2 3 5]
.
It Это действительно сложный вопрос, но его легко решить с помощью отладчика.