Recursion 循环函数和递归函数有什么区别?

Recursion 循环函数和递归函数有什么区别?,recursion,language-agnostic,functional-programming,Recursion,Language Agnostic,Functional Programming,我想通过示例简要说明循环函数和递归函数之间的区别 例如,假设我们有3个函数A、B和C。我知道,如果函数A调用同一个函数,它就调用递归。如果A叫B,B叫C,C叫A呢 有人能澄清这一点吗?递归函数是一个调用自身的函数 它可以直接调用自己(A调用A),也可以间接调用自己(A调用B,B调用C,C调用A)。它仍然是一个递归。递归函数是一个调用自身的函数 void foo(void) { bar(); } void bar(void) { foo(); } 它可以直接调用自己(A调用A)

我想通过示例简要说明循环函数和递归函数之间的区别

例如,假设我们有3个函数A、B和C。我知道,如果函数A调用同一个函数,它就调用递归。如果A叫B,B叫C,C叫A呢


有人能澄清这一点吗?

递归函数是一个调用自身的函数


它可以直接调用自己(A调用A),也可以间接调用自己(A调用B,B调用C,C调用A)。它仍然是一个递归。

递归函数是一个调用自身的函数

void foo(void)
{
    bar();
}

void bar(void)
{
    foo();
}

它可以直接调用自己(A调用A),也可以间接调用自己(A调用B,B调用C,C调用A)。它仍然是一个递归。

它被称为间接递归

void foo(void)
{
    bar();
}

void bar(void)
{
    foo();
}
在C标准中(强调矿山):

(C99,6.5.2.2p11)“应允许直接或通过任何其他函数链间接进行递归函数调用。”


如果没有退出条件(如在我的示例中),很可能会导致堆栈溢出(每次调用时都会无限添加堆栈帧,直到堆栈已满)。

这称为间接递归

void foo(void)
{
    bar();
}

void bar(void)
{
    foo();
}
在C标准中(强调矿山):

(C99,6.5.2.2p11)“应允许直接或通过任何其他函数链间接进行递归函数调用。”


如果没有退出条件(如在我的示例中),可能会导致堆栈溢出(每次调用时都会无限添加堆栈帧,直到堆栈已满)。

通常,这种差异称为直接递归和间接递归之间的差异。一个调用自身的函数显然是递归的,但即使是一个最终调用自身的函数循环也是递归的

我们称前者为直接递归,后者为间接递归

void foo(void)
{
    bar();
}

void bar(void)
{
    foo();
}
直接递归 间接递归
通常,这种差异称为直接递归和间接递归之间的差异。一个调用自身的函数显然是递归的,但即使是一个最终调用自身的函数循环也是递归的

我们称前者为直接递归,后者为间接递归

void foo(void)
{
    bar();
}

void bar(void)
{
    foo();
}
直接递归 间接递归 循环(直接递归)函数是一个调用自身的函数,如下所示:

void primary(){
    primary();
}
void primary(){
    secondary();
}

void secondary(){
    primary();
}
您在第二个示例中指出的间接递归函数是调用其他函数的函数,第二个函数再次调用第一个函数,…,如下所示:

void primary(){
    primary();
}
void primary(){
    secondary();
}

void secondary(){
    primary();
}
循环(直接递归)函数是一个调用自身的函数,如下所示:

void primary(){
    primary();
}
void primary(){
    secondary();
}

void secondary(){
    primary();
}
您在第二个示例中指出的间接递归函数是调用其他函数的函数,第二个函数再次调用第一个函数,…,如下所示:

void primary(){
    primary();
}
void primary(){
    secondary();
}

void secondary(){
    primary();
}