给定下列递归算法的代码段,分析程序的输出

a=9,b=15,运行exgcd(a,b,x,y)后,程序的输出为:

 是一个很经典的递归加地址变换的题目。

第1次递归保存:

 exgcd(15,9,y,x)  与y-=a/b*x  此时a=9, b=15

第二次递归保存:

exgcd(9,6,y,x) 与 y-=a/b*x  此时a=15, b=9

第三次递归保存:

exgcd(6,3,y,x) 与y-=a/b*x  此时a=9, b=6

第四次递归保存:

exgcd(3,0,y,x) 与y-=a/b*x  此时a=6, b=3

第五次返回(递归并没有停止,但我们要求的是运行完exgcd (有return 的值后)计算与y):

x=1,y=0

将第五次结果回溯,计算x与y 的值(总共经历四次回溯,从后往前)

第四次exgcd(3,0,y,x) 此时要注意x与y 应该交换值,因为刚开始引用的时候定义的x,y存储地址为一固定值,即x=0,y=1,更新y=y-2*0=1 

第三次 exgcd(6,3,y,x) 如上先交换x,y。即x=1,y=0,更新y=0-9/6*1=-1

第二次 exgcd(9,6,y,x) 同理交换后x=-1,y=1。更新y=1-15/9*-1=2

第一次 exgcd(15,9,y,x)同理交换后x=2,y=-1。更新y=-1-9/15*2=-1

故最后输出为x=2,y=-1

下图为程序运行结果(绿色部分未注释之前):

 认真研究后每一道题目都有其价值(科大笔试题)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值