C++ 结果为什么是7

来源:百度知道 编辑:UC知道 时间:2024/06/25 17:05:28
#include <stdio.h>

main()
{int x=0;
sub(&x,8,1);
printf("%d",x);
}

sub(int *a,int n,int k)
{if(k<=n)sub(a,n/2,2*k);
*a+=k;}

递归函数的重复调用!

第一次:x通过&x传递给a的值为0,
sub(0,8,1) ;因为1<=8,故计算需要sub(&x,8/2,2*1),即sub(0,4,2)由于sub没算完,故不计算*a+=k;
第二次:通过&x传递给a的值为0,
sub(0,4,2) ;因为2<=4,故计算需要sub(0,4/2,2*2),即sub(0,2,4)由于sub没算完,故不计算*a+=k;
第三次:通过&x传递给a的值仍为0,
sub(0,2,4) ;因为2<=4不成立,故不计算sub(0,2,4),即if语句后的不执行,而跳到*a+=k处执行,即:a=a+k=0+4=4,结束最后一层的计算。
此时根据‘最后一层计算值’反带回‘第一次’的计算中,即:
第二次:
因为求出了sub(0,2,4)为4,此时才能计算*a+=k;即a=4+2=6,这里的a取第三次计算返回的结果4,而k取值则保持本次具有的值:2。
第一次:
因为求出了sub(0,4,2)为4,此时才能计算*a+=k;即a=6+1=7,这里的a取第二次计算返回的结果6,而k取值则保持本次具有的值:1

解释的很详细了吧,答案为7!

递归算法

每次递归的时候传入参数 就是K
比如2*k就是下文的K

单步跟踪调试下,什么都出来了。