Recursion 循环函数和递归函数有什么区别?
我想通过示例简要说明循环函数和递归函数之间的区别 例如,假设我们有3个函数A、B和C。我知道,如果函数A调用同一个函数,它就调用递归。如果A叫B,B叫C,C叫A呢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)
有人能澄清这一点吗?递归函数是一个调用自身的函数
它可以直接调用自己(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();
}