C++ 理解这个递归函数 #包括 无效e(int); int main() { INTA; a=3; e(a); 返回0; } 空e(整数n) { 如果(n>0) { e(n-1); n=n-1; printf(“%d”,n); e(n-1); n=n-1; } }
我不明白它是如何计算为0120的,因为我认为如果它是0,if语句将不会运行。。。我知道我不擅长编码,但想知道是否有人能解释它是如何输出0120的。要理解递归函数,必须首先理解递归:) 说真的,尽管去看看维基百科页面和其他你能找到的文章。 这里需要记住的重要一点是,每次对e的递归调用都会增加调用堆栈,一旦返回,就会弹出调用堆栈的最后一帧,返回到上次调用e的位置 以下是在您的案例中实际发生的情况以及为什么会这样做的步骤。调试器还将允许您执行此演练:)C++ 理解这个递归函数 #包括 无效e(int); int main() { INTA; a=3; e(a); 返回0; } 空e(整数n) { 如果(n>0) { e(n-1); n=n-1; printf(“%d”,n); e(n-1); n=n-1; } },c++,c,recursion,C++,C,Recursion,我不明白它是如何计算为0120的,因为我认为如果它是0,if语句将不会运行。。。我知道我不擅长编码,但想知道是否有人能解释它是如何输出0120的。要理解递归函数,必须首先理解递归:) 说真的,尽管去看看维基百科页面和其他你能找到的文章。 这里需要记住的重要一点是,每次对e的递归调用都会增加调用堆栈,一旦返回,就会弹出调用堆栈的最后一帧,返回到上次调用e的位置 以下是在您的案例中实际发生的情况以及为什么会这样做的步骤。调试器还将允许您执行此演练:) e被3呼叫 3>0,所以我们称e为3-1(2)
像这样的简单程序可以通过一些打印来“扩充”以便于理解 您的原件:
#include <stdio.h>
void e(int );
int main( )
{
int a;
a=3;
e(a);
return 0;
}
void e(int n)
{
if(n>0)
{
e(n-1);
n = n-1;
printf("%d" , n);
e(n-1);
n = n-1;
}
}
并且它的输出是相同的(即使使用c++编译时也是如此)
这里是非常类似的递归代码,还有一些打印
// 0120
ss捕获所有n=x,以一种更简单的方式报告它们,并且不在调试cout之间交错。ss的输出:
seq=1 e2() n=3
seq=2 e2() n=2
seq=3 e2() n=1
seq=4 e2() n=0
seq=4 e2() else 0
seq=5 e2() n=-1
seq=5 e2() else -1
seq=6 e2() n=0
seq=6 e2() else 0
seq=7 e2() n=1
seq=8 e2() n=0
seq=8 e2() else 0
seq=9 e2() n=-1
seq=9 e2() else -1
注:显示的数字顺序与原始数字相同
它还显示发生了9个递归调用。(seq=9)这是你期望的吗 。。。调试打印通常也可以提供足够的信息来观察和修复编码错误 下一步尝试a=0,或1,或2,或4。。。等 并尝试添加其他打印。
练习 然后一步一步地检查中间输出,看看它是如何工作的
祝你好运。你看到那行了吗
n=n-1代码>就在打印位置上方?请澄清您想要输出的内容好吗?使用调试器或手动(非常简单)逐行运行代码,以便更容易理解。@ArtRoss使用钢笔和纸,并运行代码。到目前为止,最简单、最安全的方法是使用调试器逐步运行代码,检查每条线路上的VAR,并记录发生的情况。冲洗/重复,直到你得到它。为什么要投否决票?我错过什么了吗?
// with debug prints
void e2(int n, std::stringstream& ss)
{
static size_t seq = 0;
std::cout << "seq=" << ++seq << " e2() " << " n=" << n << std::endl; // invocation sequence
if(n>0)
{
e2(n-1, ss);
n = n-1;
ss << "n= " << n << " " << std::flush;
e2(n-1, ss);
n = n-1;
}
else
std::cout << "seq=" << seq << " e2() else " << n << std::endl;
}
int t267(int argc0)
{
std::cout << "argc0: " << argc0 << std::endl << std::endl;
int a = 3;
std::cout << "\ne()----------------------------" << std::endl;
e(a);
std::cout << "\ne2()----------------------------" << std::endl;
std::stringstream ss;
ss << "e2: " << std::endl;
e2(a, ss);
std::cout << ss.str() << std::endl;
std::cout << "\n----------------------------" << std::endl;
return(0);
} // int t267(void)
seq=1 e2() n=3
seq=2 e2() n=2
seq=3 e2() n=1
seq=4 e2() n=0
seq=4 e2() else 0
seq=5 e2() n=-1
seq=5 e2() else -1
seq=6 e2() n=0
seq=6 e2() else 0
seq=7 e2() n=1
seq=8 e2() n=0
seq=8 e2() else 0
seq=9 e2() n=-1
seq=9 e2() else -1
n= 0 n= 1 n= 2 n= 0