Tricky Pass по значению и Pass по справочному вопросу рекурсии - PullRequest
0 голосов
/ 03 февраля 2020

Ниже приведен фрагмент кода из C ++. Правильный ответ 6561, но я не совсем понимаю, почему. Я полностью понимаю, как рекурсия проходит за сценой, но я не могу сказать, почему результат полностью отличается от pass & x (reference) и x (value) в функцию. Кто-нибудь поможет мне? Я оооочень смущен ... очень признателен!

Пошагово я понимаю, что каждая рекурсия выполняет вычисление c = c - 1 и x = x + 1 и передает значение в рекурсивную забаву (x, c) в противоположность правильному ответу, который должен сохранить ту же самую копию для x, показанную как следующее:

f (5,5) = f (6, 4) * 6

f (5,5) = f (6,4) * 6 = f (7,3) * 6 * 7

f (5,5) = f (6,4) * 6 = f (7,3) * 6 * 7 = f (8,2) * 6 * 7 * 8

f (5,5) = f (6,4) * 6 = f (7,3) * 6 * 7 = f (8,2) * 6 * 7 * 8 = f (9,1) * 6 * 7 * 8 * 9 = 1 * 6 * 7 * 8 * 9 = 3024

#include <iostream>
int f(int &x, int c) {
   c  = c - 1;
   if (c == 0) return 1;
   x = x + 1;
   return f(x, c) * x;
} 

int main(){

  int a = 5; 
  int b = 5; 

  std::cout<<"final result is " << f(a,b) << "\n";

return 0;

}

Ответы [ 2 ]

1 голос
/ 03 февраля 2020
f(5,5) -> c = 4; a = x = 6
f(6,4) -> c = 3; a = x = 7
f(7,3) -> c = 2; a = x = 8
f(8,2) -> c = 1; a = x = 9
f(9,1) -> c = 0; return 1;

-----

f(8,2) returns 1 * x = 9
f(7,3) returns 9 * x = 9 * 9 = 81
f(6,4) returns 81 * x = 81 * 9 = 729
f(5,5) returns 729 * x = 729 * 9 = 6561

Надеюсь, это поможет

0 голосов
/ 04 февраля 2020
return f(x, c) * x;

, поскольку оно ссылается на значение x, не совпадающее с f(x,c) и с мультипликативным *x. последний изменился после f(x,c) вызовов end.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...