事实证明,两个连续的递归调用非常简单

电脑杂谈  发布时间:2020-07-20 15:13:40  来源:网络整理

c递归调用_函数的递归调用_递归 2次调用

void rec(int N) {
//为了区分这两个递归,分别为它们取个别名好了
	if (N>0){
                rec(N - 1);//rec1
		rec(N - 10);//rec2
	}
	cout << "N=" << N << endl;
	cout << "最后一句了" << endl;
}

第一步: 前11个递归必须是仅将rec1递归推入堆栈. 毫无疑问,这是被压入堆栈之后的情况

c递归调用_函数的递归调用_递归 2次调用

第2步: 在rec1递归之后,开始弹出. 第一次弹出堆栈时,获得N = 0,并判断N是否满足递归条件. 当然,每次弹出堆栈后都必须对其进行一次判断. 显然,N = 0不满足递归条件,因此直接跳转到下两个cout语句. 这样就完成了第一个弹出操作.

步骤3: rec1的第二个弹出窗口,读取的元素为1,即N = 1. 请注意,此时堆栈的顶部元素1不会被删除. 在rec1处获取元素后,继续向下执行,直到rec2递归语句,这一次将中断rec1的堆栈操作,并执行rec2的堆栈操作,因此,将rec2递归输入堆栈,然后输入Stack元素是-9(因为1-10 = -9). 显然,此时,不满足再次被推到堆叠上的条件. 然后rec2将直接从堆栈中弹出,弹出的元素为-9,然后跳转到后者执行cout语句递归 2次调用,堆栈更改过程如下:

递归 2次调用_c递归调用_函数的递归调用

步骤4: 如前所述递归 2次调用,rec1将中断其自己的操作以首先执行rec2,然后现在执行rec2,然后rec1可以继续其弹出操作,因此N的值变为1,即N = 1 ,然后继续执行,即执行cout操作,并且rec1的第二次弹出操作完成. 现在,堆栈如下所示:

c递归调用_递归 2次调用_函数的递归调用

最后,在rec1完成第二次弹出后,继续执行rec1弹出操作并重复上述步骤. 上面已经说了很多,实际上,它是按代码顺序执行的.

以下是弹出堆栈的过程:

c递归调用_函数的递归调用_递归 2次调用

使用以下代码解释按代码顺序执行的含义:

void rec(int N) {
	
	
	if (N>0){
		rec(N - 10);//rec1
		rec(N - 1);//rec2
	}
	cout << "N=" << N << endl;
	cout << "最后一句了" << endl;
}

输出结果:

此代码非常明显. Rec1一次只能被压入堆栈一次,我们会发现前一个0〜-9实际上是由rec1压入并弹出的. 如前所述,原因是按代码顺序执行的. 每次将rec2压入堆栈时,必须由if语句判断,然后执行rec1,然后首先执行rec1,然后可以将rec2翻转;返回0〜9的输出是因为cout语句直接在rec2之后,并且在pop操作期间,它是从每次需要弹出(rec2)的语句执行的,因此它是的连续输出. 0〜9.


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-287213-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...