4

请考虑递归函数:

 1)   int calc(int num)
       {

 2)    sum=sum+num;//sum is a global variable

 3)    num--;

 4)    if(num==0)
 5)    return sum;

 6)    calc(num);

       }

它计算一个整数的和。我的老师告诉我这不是递归,而是一个简单的函数调用,因为您需要 num--作为参数传递并返回calc(num--)

我很震惊,因为当函数调用自身时我只知道一件事,它的递归。

她也给出了原因,那行不行。23额外存储在堆栈内存中。我不知道她指的是什么。所以在通过堆栈存储之后:

在此处输入图像描述

在这里,我注意到传递的函数参数是以递归方式传递的,就像n--在我的function. 让他们可以联系到下一个function call

为了这个缘故,我们可以把它称为简单function call的而不是recursion

4

3 回答 3

3

即使您所介绍的内容在技术上是递归的,老师也有一些非常具体的内容。另一种不依赖于全局的形式看起来像这样:

int calc(int num)  // Assume this is valid for non-negative numbers
                   // In that case, type "unsigned int" would be more appropriate
{
    if ( num < 0 )
        return -1;  // Consider this an error; won't happen in recursive case

    if ( num == 0 )
        return 0;

    return num + calc(num-1);
}
于 2013-11-08T18:03:31.090 回答
2

对于给定的 ,您似乎正在尝试计算 to的num总和。该函数实际上只需要一个参数 ,然后可以调用一个辅助函数,该函数接受当前数字和运行总和:0numcalcnumcalc_num

int calc( int num ) {
  return calc_help( num, 0 );
}

然后,calc_help,给定一个当前数字和到目前为止的总和,检查是否num小于或等于零。如果是,则当前运行总和是最终总和,可以返回。否则,将进行递归调用calc_help。它的当前数字将小于 1 num(因此我们calc_help使用连续更小的第一个参数调用,越来越接近 where 的情况num <= 0),当前总和将是总和加上当前数字:

int calc_help ( int num, int sum ) {
  return num <= 0 ? sum : calc_help( num-1, sum+num );
}

在执行尾调用优化的语言(如 Scheme)中,这本质上是以下循环。一些 C/C++ 编译器确实执行尾调用优化(例如,根据gcc/g++ 中的尾递归,GCC 将在指定时优化尾调用-O2),所以这并不完全是一个有争议的问题。

int calc( int num ) {
  int sum = 0;
  while ( num > 0 ) {
    sum = sum+num;
    num = num-1;
  }
  return sum;
}

或者(如果你想变得更晦涩):

int calc( int num ) {
  int sum = 0;
  for ( ; num <= 0; sum+=num, num-- );
  return sum;
}

在递归调用之后执行加法的更天真的递归实现,即

int calc( int num ) {
  return num <= 0 ? num : num + calc( num-1 );
}

无法以这种方式进行优化。

于 2013-11-08T18:16:56.257 回答
2

你是对的,递归是一个调用自身的函数。时期。关于全局变量和其他良好的编程实践,还有其他值得单独讨论的要点,但是无论您是在递归调用函数的代码行中还是在该点之前实现递减运算符,您仍然在进行递归调用。

于 2013-11-08T18:05:39.377 回答