大虾快来啊,偶刚学不会哦,指针好难啊!我都不懂哦

来源:百度知道 编辑:UC知道 时间:2024/07/04 09:46:51
#include<stdio.h>
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);/* k的值是怎么变化的,我怎么觉得它没有变化的啊,它是怎么变化的哦??*/
*a+=k;
}/*最后的答案是怎么得的捏?大虾帮忙解释一下了*/
我还是算不得哦,不会算哦 哪位再分析清楚点呀

咱们从k=1开始算,第一个是
sub(int *a, 8, 1)
{ if(k<=n) sub(a,n/2,2*1);//这里的k是2*k的值,其他的也是乘二的关系
*a+=k;//对*a的值也更改
}
########################################
sub对a是传址调用,这个清楚
第一次:
sub(&x,8,1);
sub(int *a, int n, int k)
if(k<=n) sub(a,n/2,2*k);
*a+=k;
}
k=1<8=n,再次调用sub(a,8/2,2*1);
即sub(a,4,2)
k=2<4=n,再次调用sub(a,4/2,2*2);
即sub(a,2,4)
k=4,n=2
不满足if,仅执行*a+=k
再将每次的k相加,返回a*=a*+4+2+1=7;

悬赏分5

递归,将2*k的值作为传递参数再次调用自身,那么自己调用自己,k的值会因每次都乘了个2慢慢增大

它自身调用自身,将2*k作为参数又传给了k这样就相当于K扩大了2倍