这会是尾调用吗?

问题描述 投票:0回答:1

我的代码中的递归调用是尾调用还是只是普通的递归?

void sum(const int values[], size_t count,int* result){
  if(count <= 0) return;
  *result += values[0];
  sum(values + 1,count - 1,result);
}

因为据我所知,尾调用是函数中最后一次调用时发生的递归。

c recursion tail-recursion
1个回答
1
投票

如果调用后面没有代码,则为尾调用。

在 C 中,这需要以下之一:

void g( … );

void f( … ) {
   …
   g( … );  // Tail call.
}
void g( … );

void f( … ) {
   …
   g( … );  // Tail call.
   return;
   …
}
T g( … );

T f( … ) {
   …
   return g( … );  // Tail call.
   …
}

它与递归无关,但它确实包含递归调用。

尾部调用很有趣,因为它们可以被消除。 C 既不强制也不禁止消除尾调用。这取决于编译器。

© www.soinside.com 2019 - 2024. All rights reserved.