package main

func combinIter(n int, k int, last []int, res *[][]int) {
	solution := make([]int, len(last))
	copy(solution, last)
	if k == 0 {
		*res = append(*res, solution)
		return
	}
	var i int
	if len(solution) != 0 {
		i = solution[len(solution)-1] + 1
	} else {
		i = 1
	}
	for ; i <= n; i++ {
		combinIter(n, k-1, append(solution, i), res)
	}
}

func combineOld(n int, k int) (res [][]int) {
	combinIter(n, k, []int{}, &res)
	return
}

// a cleaner way of recursion
/* func combine(n int, k int) (res [][]int) {
	// Cnn or C0n
	if n == k || k == 0 {
		row := make([]int, k)
		for i := range row {
			row[i] = i + 1
		}
		return append(res, row)
	}
	// C(k)(n) = C(k-1)(n-1) + C(k)(n-1)
	for _, row := range combine(n-1, k-1) {
		row = append(row, n)
		res = append(res, row)
	}
	res = append(res, combine(n-1, k)...)
	return
} */

/* func main() {
	fmt.Println(combine(4, 2))
	fmt.Println(combine(5, 4))
	fmt.Println(combine(1, 1))
}
*/