我在考试中遇到了这个问题 - 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;
}
Run Code Online (Sandbox Code Playgroud)
我知道要解决这些类型的问题,应该了解FUNCTION实际上在做什么.它可以为您节省大量时间,因为您不必为每种情况运行(这可能需要相当长的时间).我改为运行案例并找到了结果.所以,我想知道这个'数字'函数究竟是做什么的?如果它做了一些有意义的事情,如计算平方或类似的东西.我找不到它的通用答案.
这是一个递归函数,用于计算n个自然数之和,其中'n'是递归函数的输入.
如果您尝试过一些样本输入,您可以轻松推断出它.以下是一些样本: -
输入输出
2 3
5 15
7 28
10 55
计算n个自然数之和的数学公式为: -
( n * ( n + 1 ) ) / 2
Run Code Online (Sandbox Code Playgroud)
解释(感谢molbdnilo): -
假设你想要将数字从1加到100.
Compute (1 + 100) + (2 + 99) + (3 + 98) + ... + (98 + 3) + (99 + 2) + (100 + 1) =
101 + 101 + ... + 101 = 100 * 101 = 10100.
Run Code Online (Sandbox Code Playgroud)
由于每个数字在求和中出现两次,因此您要查找的总和是
10100/2 = 5050;
Run Code Online (Sandbox Code Playgroud)
总和是
n*(n+1)/2.
Run Code Online (Sandbox Code Playgroud)
(如果你计算2*sum(n/2)一个偶数'n',你会注意到它是(nn + 2n)/4,同时sum(n)是(2*nn + 2*n)/4).添加n*n/4到2*sum(n/2)然后你得到sum(n)).
编辑回应评论: -
@halkujabra molbdnilo给出了很好的解释.
@Jonathan: - No Integers包括数字行上的整个数字范围(没有小数部分的数字)
... -100, -50 , 0 , 50 ,100...
Run Code Online (Sandbox Code Playgroud)
整数是非负整数即
0, 50, 100
Run Code Online (Sandbox Code Playgroud)
自然数: - 整数 - 0,即
1, 50, 100
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
114 次 |
| 最近记录: |