我在考试中遇到了这个问题 - http://ideone.com/uMausI
代码是——
#include <stdio.h>
int number(int n)
{
if(n == 1)
return n;
int half = n/2;
int k = 2*number(n/2) + half*half;
return (n%2)?(k+n):k;
}
int main(void) {
printf("%d",number(11));
return 0;
}
我知道要解决这类问题,应该了解 FUNCTION 实际上在做什么。它为您节省了很多时间,因为您不必为每个案例都运行(这可能需要更长的时间)。相反,我运行了这个案例并找到了结果。所以,我想知道这个“数字”函数到底做了什么?如果它做了一些有意义的事情,比如计算平方或类似的事情。我找不到通用的答案。
这是一个递归函数,用于计算 n 个自然数的总和,其中“n”是递归函数的输入。
如果您尝试使用一些示例输入,您会很容易地推断出它。以下是一些示例:-
输入输出
2 3
5 15
7 28
10 55
计算n个自然数之和的数学公式为:-
( n * ( n + 1 ) ) / 2
解释(感谢 molbdnilo):-
假设您想对 1 到 100 的数字求和。
Compute (1 + 100) + (2 + 99) + (3 + 98) + ... + (98 + 3) + (99 + 2) + (100 + 1) =
101 + 101 + ... + 101 = 100 * 101 = 10100.
由于每个数字在求和中出现两次,因此您要查找的总和是
10100/2 = 5050;
总和是
n*(n+1)/2.
(如果您计算偶数“n”的 2*sum(n/2)
,您会注意到它是 (nn + 2n)/4
,而 sum(n)
是 (2*nn + 2*n)/4)
。
将 n*n/4 与 2*sum(n/2) 相加,得到 sum(n)
)。
根据评论进行编辑:-
@halkujabra molbdnilo 给出了很好的解释。
@Jonathan:- 没有整数包括数轴上的整个数字范围(没有小数部分的数字)
... -100, -50 , 0 , 50 ,100...
整数是非负整数即
0, 50, 100
自然数:- 整数 - 0 ,即
1, 50, 100