首页 > 试题广场 >

假设a=8,b=2012,Recurse()函数的返回值是?

[填空题]
int Recurse(int a, int b)
{
    if(a >= b)
    {
        if(a == b)
            return a;
        else
            return 0;
    }
    else
    {
        return Recurse(a + 1, b - 1) + a + b;
    }
}
假设a=8,b=2012,Recurse函数的返回值是1
推荐
a,b会等于(2012+8)/2=1010, 结果1010+(2012+8)*(1010-8)=2025050
编辑于 2015-02-09 00:37:33 回复(0)
举个例子:如果a = 1, b = 7, 通过递归会,我们得到4 + 3 + 5 + 2 + 6 + 1 + 7,从中可以发现,这是求从1到7的和, 所以对于a = 8, b = 2012, 应用以上规律,和为(8 + 2012)*2005 / 2 = 2025050
发表于 2015-07-27 05:13:23 回复(3)
考虑递归退出条件为a=b;
对于a<b时有函数f(a,b) = f(a+1,b-1)+a+b;
要让递归函数退出,需要a=b,假设a执行了x加1,b执行了x次减1,则有
a+x = b-x 得到:x=(b-a)/2;
即f((a+b)/2,(a+b)/2)时函数退出,尾数(a+b)共执行加法x次,
所以,最后答案:(a+b)/2+(a+b)*(b-a)/2 = 1010+2020*1002=2025050

发表于 2016-08-26 17:04:44 回复(2)
递归过程中Recurse(8, 2012)=  Recurse(9,2011) +    8               +  2012
                          =  Recurse(10,2010) +   8+9             +  2012+2011
                          =  Recurse(11,2009) +   8+9+10          +  2012+2011+2010
                          =  ...              +   ...             +  ...
                          =  Recurse(1010,1010)+  8+9+10+...+1009    +  2012+2011+2010+...+1011
                          =  8+9+......+2012
                          =  2025050
发表于 2016-08-26 10:56:20 回复(0)
很容易看出规律,和为(8 + 2012)*2005 / 2 = 2025050
发表于 2016-07-27 09:16:02 回复(0)
计算从8一直加到2012的值,即(8+2012)*2005/2 = 2025050
发表于 2017-01-15 11:23:30 回复(0)
(1010-8)*2020+1010=2025050.
发表于 2015-08-06 08:38:14 回复(1)
举个例子:如果a = 1, b = 7, 通过递归会,我们得到4 + 3 + 5 + 2 + 6 + 1 + 7,从中可以发现,这是求从1到7的和, 所以对于a = 8, b = 2012, 应用以上规律,和为(8 + 2012)*2005 / 2 = 2025050

等差数列:
(首项 + 末项) * 项数 / 2 
8 + 2012)*2005 / 2 
2025050
发表于 2017-07-01 17:44:21 回复(0)
a+x=b-x,则x=(a+b)/2 个2020 a=b=(a+b)/2时退出
发表于 2017-06-08 01:58:52 回复(0)
考虑递归退出条件为a=b;
对于a<b时有函数f(a,b) = f(a+1,b-1)+a+b;
要让递归函数退出,需要a=b,假设a执行了x加1,b执行了x次减1,则有
a+x = b-x 得到:x=(b-a)/2;
即f((a+b)/2,(a+b)/2)时函数退出,尾数(a+b)共执行加法x次,
所以,最后答案:(a+b)/2+(a+b)*(b-a)/2 = 1010+2020*1002=2025050
发表于 2017-04-13 15:43:16 回复(0)
1010+(2012-1010)*(2012+8)
发表于 2017-04-06 10:25:52 回复(0)
加1002次,1002乘以2020,然后最后相等时返回1010,总共2025050
发表于 2017-02-27 16:47:48 回复(0)
莯头像

1002*2020+找到出口时返回的1010

发表于 2017-02-24 13:50:53 回复(0)
递归求和 8到2012之间有2003个数(2011-9+1); 2003为奇数,2003/2=1001,取整; 在比较最后a&gt;=b之前:a=8+1001=1009,b=2012-1001=1011,再执行一次a加b减得a==b==1010,即最后递归返回的就是这2003个数的最中间那个(1010); (8+2012)*1002+1010=最终答案。
编辑于 2016-09-02 15:14:26 回复(1)
为什么算出来是2040040😔
发表于 2016-08-25 23:31:16 回复(1)
当a<b时,递归调用Recurse方法,每次最终的返回值加上a+b,直到a = b;
Recurse(a,b) = Recurse(a-1,b+1)+a+b = Recurse(a-2,b+2)+2*(a+b)=...
所以Recurse(8,2012) =Recurse(1010,1010)+(1010-8)*2020=1010+1002*2020
发表于 2016-08-11 11:18:27 回复(1)
感觉是不是有错误啊!int型最大65535,这不是溢出啦么?
发表于 2016-07-09 21:29:40 回复(2)
动笔写一下能更好的看出规律,当a==b的时候就可以结束调用了,最后表达式为Recurse(1010,1010)+2020*1002=2025050
发表于 2016-06-17 15:50:22 回复(0)
void text(int s1,int s2)
{
	int count= 0; ;
		 	
	for(int i= 0 ;i < 2012;i++)
	{
		s1++;
		s2--;	
		count++;
		if(s1 == s2)
		{
			break;
		}
	
		
	}
	cout<<s2<<endl;//相等的值
	 cout << count<<endl;//求出想等时经历的次数
}
void txe()
{
	int b=8;//1013+
	int a= 2012;
	int sum1 = 0;//
	int sum2 = 0;
	for(int i= 0;i<1002;i++)
	{
		 sum1 = sum1+b;//8一直加到s1
		 sum2 = sum2 +a;//2012一直加到s1
		b++;
		a--;
	}
	cout<<sum1+sum2+1010<<endl;//2024040+1010
}
新手写的不好,见谅

发表于 2016-04-21 11:45:11 回复(0)
递归一次a的值加1,b的值减1,当形参满足相等时,进入条件语句代码块。此时一共有1002次递归,此时有返回值1010。两参数加一减一相互抵消,一共有1001次。所以1001*(a+b)+1010=结果。
发表于 2016-03-10 17:01:10 回复(0)
第十题有错……和答案不对
编辑于 2015-09-14 00:57:21 回复(0)