n = 0 -> 1 k = 1 -> 1 k = 2 -> n + 1 k > 2 -> func(n, k - 1) + func(n - 1, k - 1) + .... + func(0, k - 1) // 0 + ... 1 + ... n + 0 + ... + 0
this way recursively ...
int func(int n, int k) { assert (n >= 0); assert (k > 0); if (n == 0 || k == 1) { return 1; } else if (k == 2) { return n + 1; } else { int sum = 0; for (int i = 0; i <= n; i++) { sum += func(i, k - 1); } return sum; } }
to eliminate excess calculation
int result[NMAX + 1][KMAX + 1] = {0}; int func(int n, int k) { assert (n >= 0); assert (k > 0); if (n == 0 || k == 1) { return 1; } else if (k == 2) { return n + 1; } else if (result[n][k] != 0) { return result[n][k]; } else { int sum = 0; for (int i = 0; i <= n; i++) { sum += func(i, k - 1); } result[n][k] = sum; return sum; } }
source share