天人中学视频:我是C语言初学者,帮我详细解释一下这道体

来源:百度文库 编辑:高考问答 时间:2024/05/11 15:33:37
main()
{ int x=0;
sub(&x,8,1);
printf("%d\n",x);
}
sub(int *a,int n,int k)
{ if(k<=n) sub(a,n/2,2*k);
*a+=k;
}
为什么答案是7?????

一楼回答的不对
应该是;
n=8 k=1
先递推sub(*a,8,1),sub(*a,4,2),sub(*a,2,4),注意在这个里k 每次都在改变.回朔的时候a=a+k=0+4=4,然后 a=a+k=4+2=6
:a=a+k=6+1=7,最后得到7
我想强调的是在递推的时候的顺序和回朔的顺序是相反的!

n=8 k=1
sub(*a,8,1)=sub(*a,4,2)=sub(*a,2,4):a=a+k=0+4=4
退回sub(*a,4,2):a=a+k=4+2=6
退回sub(*a,8,1):a=a+k=6+1=7
传地址值会变的,注意递归

sub函数里的第一个参数是传址行参 main里的x会随着sub里的x的改变而跟着改变 main里的其他值不变
sub里还有个递归算法 当k<=n时 要再运行一遍sub函数 这时 sub里的参数又变了一次 直到k>n时 才运行*a+=k
例子楼上已经举的很详细了
所以答案是7