注册 登录
编程论坛 C++教室

写出下题的答案及解析过程!谢谢啦!

雪色朝阳 发布于 2010-03-15 12:19, 584 次点击
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;
}
4 回复
#2
quietstar2010-03-15 12:51
很糟糕的风格+很多的错误...
修改如下:
#include<iostream.h>

void sub(int *a,int n,int k);

int main()
{
    int x = 0;
    sub(&x,8,1);
    cout<<x<<endl;
    return 0;
}

void sub(int *a,int n,int k)
{
    if(k<=n)
    {
        sub(a,n/2,2*k);
    }
    *a+=k;
}
答案是7。解释如下:
sub是一个递归函数,结束的条件是n的一半大于等于k的2倍;在本例中,n是8,k是1,第一次调用的时候k值是1,然后递归调用二次,每次递归的k值分别是2、4;整个过程*a+=k这条语句共执行三次,所以最终*a=1+2+4=7。程序实际是想找出符合递归条件的k值的和。ps:是不是有哪个数学公式是这样子描述的?
#3
quietstar2010-03-15 12:59
几点错误:
1、main函数应当设置为返回int类型;
2、sub函数未声明就调用的;
3、使用printf函数要包含头文件<stdio.h>。
几点建议:
1、printf函数是c的遗留产物,建议采用c++的cout;
2、{符号单独占用一行;
3、sub函数体里面,*a+=k语句之前不用加{}。
4、传递一个指针,还不如让函数返回结果值(当然这点见仁见智了,指针这东西,能不用就不用了..)
#4
wei00002010-03-15 20:16
答案是6啦,不是每次递归都运行*a+=k;只是递归完后运行*a+=k
#5
雪色朝阳2010-03-15 20:47
回复 3楼 quietstar
嗯,谢谢,分析得很透彻!明白了!~
1