Я пытаюсь выяснить следующую проблему для предстоящего теста. Я искал везде, и я понимаю основы рекурсии. То, что я не понимаю для этого конкретного вопроса, - это значение int n
и int k
соответственно. У меня есть ответ на этот вопрос, поскольку это вопрос практики, но я понятия не имею, как был найден ответ.
// Precondition: n and k are non-negative integers
int f(int n, int k) {
if (k * n == 0)
return 1
else
return f(n - 1, k - 1) + f(n - 1, k)
}
Какое значение возвращается вызовом f(4, 2)
?
Я не уверен, в чем проблема
f(4,2)=f(3,1) + f(3,2)
=(f(2,0)+f(2,1) )+ (f(2,1) +f(2,2))
=(1 +(f(1,0)+f(1,1))+((f(1,0)+f(1,1))+(f(1,1)+f(1,2))
=(1 + 1 +(1+1)) +( 1 +(1+1) + (1+1) +1 + 1 ))
=11
Посмотрите, как это называется.
f (4,2) переходит во 2-й блок, вызывает f (3,1) +f (3,2)
f (3,1) вызывает f (2,0) +f (2,1) = 1 +f (1,0) +f (1,1) = 1 + 1 +f (0,0 ) +f (0,1) = 1 + 1 + 1 + 1 = 4
f (3,2) вызывает f (2,1) +f (2,2) = f (1,0) +f (1,1) +f (1,1) +f (1, 2) и т.д.
Вы должны быть в состоянии работать здесь.
f
вызвал какой другойf
- это легко увидеть, если сделать отступ для каждого вызова относительно строки функции, которая его сделала). В итоге вы построите полное дерево вызовов и увидите, как распространяются значения.