这个"数字"功能有什么作用?

hal*_*bra 0 c function output

我在考试中遇到了这个问题 - 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实际上在做什么.它可以为您节省大量时间,因为您不必为每种情况运行(这可能需要相当长的时间).我改为运行案例并找到了结果.所以,我想知道这个'数字'函数究竟是做什么的?如果它做了一些有意义的事情,如计算平方或类似的东西.我找不到它的通用答案.

rav*_*avi 5

这是一个递归函数,用于计算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)

  • @halkujabra假设您想要将数字从1到100求和.计算(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),你会注意到它是(n*n + 2n)/ 4,而sum(n)是(2*n*n + 2*N)/ 4).将n*n/4加到2*sum(n/2),得到sum(n)). (2认同)