帮我说说怎么算出来的

a266328633 2012-09-18 12:17:52
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,请详细说说每一步,谢谢了
...全文
116 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
HAN-Kai 2012-09-18
  • 打赏
  • 举报
回复
学习了。
tbg1986tbg 2012-09-18
  • 打赏
  • 举报
回复
vc6.0 结果3
zhengqieqie 2012-09-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
在vs10下,输出为3,不为7..........
[/Quote]
你直接复制楼主的程序吗?
根本就是错的啊!
稍微修改一下之后,我在vs10下也是输出7,怎么会是3啊?
zhengqieqie 2012-09-18
  • 打赏
  • 举报
回复
1楼讲得很不错了,不过楼主这个代码很有问题,很不规范,而且有错吧!

if(k<=n);
sub(a,n/2,2*k);

if后面的分号不去掉会无限递归了!
shen_wei 2012-09-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
原程序是有问题的,递归函数sub没有返回的条件,会导致堆栈溢出,应改为类似如下的方式:

C/C++ code


#include <stdio.h>

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

in……
[/Quote]

按照这个方式来写。。注意溢出!!
__phoenix 2012-09-18
  • 打赏
  • 举报
回复
在vs10下,输出为3,不为7..........
图灵狗 2012-09-18
  • 打赏
  • 举报
回复
另外,你可以把递归理解为数列。
图灵狗 2012-09-18
  • 打赏
  • 举报
回复
原程序是有问题的,递归函数sub没有返回的条件,会导致堆栈溢出,应改为类似如下的方式:

#include <stdio.h>

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

int main(int argc, char* argv[])
{
int x = 0;

sub(&x, 8, 1);
printf("%d\n", x);

return 0;
}

__phoenix 2012-09-18
  • 打赏
  • 举报
回复
[code=c/c++]
main()
{int x=0;//初始化x,另x为0
sub(&x,8,1);//调用sub函数,执行sub(&x,8,1)
printf("%d\n",x);//打印计算结果,x的值
}
sub(int *a,int n,int k)//自定义函数sub
{if(k<=n);//递归的判断条件,当k>n时,函数结束
sub(a,n/2,2*k);//递归执行,k的值分别取 1,2,4,当k=4时,sub(a,2,4),不满足(k<=n),所以结束
*a+=k;//a的值就为1+2+4=7
}

[/code]
冷月清晖 2012-09-18
  • 打赏
  • 举报
回复

main()
{int x=0;//初始化x为0
sub(&x,8,1);//执行sub函数
printf("%d\n",x);//打印x值
}
sub(int *a,int n,int k)
{if(k<=n);//
sub(a,n/2,2*k);//递归执行 k值分别 1,2,4
*a+=k;//在递归条件结束时 1+2+4 = 7
}

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧