【问题标题】:Tricky Pass by Value and Pass by Reference Recursion Question棘手的按值传递和按引用传递递归问题
【发布时间】:2020-05-18 21:42:45
【问题描述】:

以下是来自 C++ 的代码 sn-p。正确答案是 6561,但我不太明白为什么。我完全理解递归是如何在幕后运行的,但我不知道为什么将 &x (引用)和 x (值)传递给函数的结果完全不同。有人会帮我吗?我很困惑......非常感谢!

我一步一步的理解是,每次递归都会计算 c = c - 1 和 x = x + 1 并将值传递给递归 fun(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;

}

【问题讨论】:

  • 请更具体。你到底有什么不明白的?如果您在纸上手动执行程序,您会得到什么结果,它与正确结果有何不同?您可以将手动评估添加到问题中吗?你首先了解 C++ 中的引用是什么吗?
  • 感谢核桃的回复!是的,我确实了解 C++ 中定义的引用,主要是别名。我将编辑问题并使其更清楚。请在几分钟后查看。非常感谢!
  • 尝试在每次迭代中打印出 x 和 c 以帮助您理解。
  • 我相信这与 x 的值有关... (*x)。当您通过引用传递时,该值将是函数开始返回时 x 的最后一个值。而如果它是按值传递的,它将是每个作用域 x 的值。希望这是有道理的。
  • @Eyal D 是的,我已经这样做了。每次递归都给我 x = 6, 7, 8, 9;但是,答案与我每次递归得到的结果相矛盾。正如答案所暗示的,递归中的每个 x 都应该等于 9。

标签: c++ pass-by-reference pass-by-value


【解决方案1】:
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

希望对你有帮助

【讨论】:

    【解决方案2】:
    return f(x, c) * x;
    

    因为它是指 x 的值与 f(x,c) 中的 x 值不同,并且与乘法值 *x 中的值不同。后者在f(x,c) 调用结束后发生了变化。

    【讨论】:

      猜你喜欢
      • 2014-08-23
      • 2015-05-23
      • 2013-07-22
      • 2019-01-20
      • 2021-06-18
      • 2016-03-15
      • 2012-07-29
      • 2014-04-04
      • 1970-01-01
      相关资源
      最近更新 更多