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
下图为程序运行结果(绿色部分未注释之前):
认真研究后每一道题目都有其价值(科大笔试题)