当函数发生递归调用时,同一个局部变量在不同递归深度上可以同时存在不同的取值,这在底层是如何做到的?
答:对同一个函数的多次不同调用中,编译器会为函数的形参和局部变量分配不同的空间,它们互不影响。
你在源代码中看到的一个局部变量,其实在函数递归过程中是存在很多副本的。
比如,你在源代码中看到一个局部变量 a
其实在函数递归掉用的时候,每调用一次都会在所调用函数的运行空间里存储一个a的,所以其实存在很多很多的不同的a,他们各自的存储空间是不一样的,当然能存储不同的取值了。
如
开始调用t(),先为t()分配存储空间,存储空里有一个a
然后t()调用t()(我们称之为t1()),先为t1()分配存储空间,存储空间里有存一个a(与前面的a是不同的)
t1()又调用t()(我们称之为t2()),先为t2分配存储空间,存储空间里存一个a(又是一个不同的a)
.....................以此类推
所以,并不是“同一个局部变量在不同程度上可以同时存在不同的取值”
而是“不同的局部变量在不同的函数空间里存储了不同的值”
例如:
//将src针的最上面一个盘子移动到dest针上
void move(char src, char dest) {
cout << src << " --> " << dest << endl; }
//将n个盘子从src针移动到dest针,以medium针作为中转
void hanoi(int n, char src, char medium, char dest)
{
if (n == 1)
move(src, dest);
else
{
hanoi(n - 1, src, dest, medium);
move(src, dest);
hanoi(n - 1, medium, src, dest);
}
}
int main()
{
int m;
cout << "Enter the number of diskes: ";
cin >> m;
cout << "the steps to moving " << m << " diskes:" << endl;
hanoi(m, 'A', 'B', 'C');
return 0;
}