【问题标题】:C Code: Passing expression as an argument in recursion callC 代码:在递归调用中将表达式作为参数传递
【发布时间】:2014-11-02 21:19:23
【问题描述】:

我在练习一些 C 问题时遇到了一个场景,其中递归函数使用表达式作为参数调用自身。

Pow(double x, unsigned n){ 
  .....
  .....
  return Pow(x*x,n/2);
 }

我的问题是在评估表达式时是否传递参数(x * x,如按值调用)还是这是一个惰性评估,即直到使用时才评估。

下面是详细问题

求调用 Pow(5.0,12) 的乘法数?

Pow(double x, unsigned n) { 
     if(n==0)   return 1;
     if(n==1)   return x;
     if(n%2==0) return Pow(x*x,n/2);
     else      
     return Pow(x*x,n/2)*x;
}

选项 5、6、8、12

【问题讨论】:

    标签: c recursion parameter-passing generic-programming call-by-value


    【解决方案1】:

    正确答案是 4:
    调用pow(5,12); 执行% * / 并调用pow(25,6); 执行% * / 并调用pow(625,3); 执行% * / * 并调用pow(390625,1);,后者不执行。

    如果您的意思是 % * 或 / 等所有操作,答案是 10。如果您只表示 * 和 /,答案是 7。

    【讨论】:

      【解决方案2】:

      C 中函数的所有参数都在函数被调用之前进行评估。

      您的示例中的评估和调用:

      Pow(5, 12) = Pow(5 * 5, 6) = 
      Pow(25, 6) = Pow(25 * 25, 3) =
      Pow(625, 3) = Pow(625 * 625, 1) * 625
      

      【讨论】:

      • 所以问题的答案是 4(即乘法数)?
      • 是的,我认为 4 是正确的(请参阅我的编辑列出调用和评估)。总共有 4 次乘法。
      【解决方案3】:

      递归函数是对自身执行调用的函数。调用没什么特别的,就是普通的函数调用,只是调用者和被调用者是一样的。所以它确实按值传递,就像在所有其他函数调用中一样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-09
        • 1970-01-01
        • 2013-03-28
        • 1970-01-01
        相关资源
        最近更新 更多