单选题
在下列程序中;
Program test(input, output);
var i, j: integer;
procedure calc(p1, p2:integer);
begin p2:=p2*p2 p1:=p1-p2; p2:=p2-p1;endcaic
beginmaini:=2;j:=3;
calc(i,j);write(j);
endmain
当参数传递采用引用方式(Call by reference)时,所得结果j= (33) ;
当参数传递采用换名方式(Call by name)时,所得结果j= (34) ;
当参数传递采用赋值方式(Call by value)时,所得结果j= (35) ;
递归是程序设计中很重要的一种控制结构,通常实现递归时,采用的数据结构是 (36) 。
对那些既可以用递归方式,也可以用循环方式求解的问题,就执行效率而言 (37) 。
【正确答案】
C
【答案解析】[解析] 一个过程的过程体若包含对其自身的调用,则称此过程是直接递归的。若一个过程的过程体调用某过程,而该过程又调用原过程或经一系列调用后又回到对原过程的调用,则称此原过程是间接递归的。通常实现递归时采用的数据结构是栈,这是因为栈有先进后出的特性,可以保存调用时的“现场”,并在调用结束时恢复“现场”,栈是实现递归的简单途径。对于既可用递归方式求解,也可用循环方式求解的问题,就执行效率和资源而言,显然是循环优于递归,因为递归的开销大。
当用户在调用点调用一个过程时,会通过参数传送信息,一个过程的形式参数用来向过程传送信息的标识符,实在参数用来在调用点向被调用过程传送信息。形式参数和实在参数之间的关系通常按位置来标定,不同程序语言所规定的参数信息传送方式不同。
当采用引用方式(Call by reference)或换名方式(Call by name)时,在过程中对形式参数的调用本质上是对实在参数单元的引用。先是给形式参数赋初值,而后,在过程中对该形式参数的赋值最终引起调用程序中实在参数值的改变。在本题中形式参数为p1和p2。实在参数初值为i=2和j=3,通过引用方式调用这两个参数,将执行以下计算过程:
p1=2,p2=3 p2:=p2*p2=9 p1:=p-P2=2-3=-7 P2:=p2 -p1=9-(-7)=16
所得结果为j=16。
参数传送采用赋值方式时,从调用点向被调用过程传送的是实在参数的值。这一值成为过程中相应位置上形式参数的初值,此后该形式参数在过程中实际是局部变量,其结果无需返回给实在参数。本题中实在参数j=3,在过程中仅起向形式参数p2赋初值的作用。过程中关于p2的运算对j不再起作用,因而过程调用结束后j的值仍为3。