C代码:在递归调用中将表达式作为参数传递

时间:2014-09-09 12:37:30

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

我正在练习一些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

3 个答案:

答案 0 :(得分:5)

在调用函数之前,将对C中函数的所有参数进行求值。

示例中的评估和调用:

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

答案 1 :(得分:2)

递归函数是一个对自身执行调用的函数。这个电话没什么特别之处,它只是一个普通的函数调用,只是调用者和被调用者一样。所以它通过值传递,就像在每个其他函数调用中一样。

答案 2 :(得分:0)

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

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