如何从1开始找到n个奇数的总和?

时间:2017-11-21 03:48:09

标签: php algorithm sum integer

今天我接受了采访,我不知道如何回答这个问题...

  

给出一个递归算法,找出第一个n个奇数正整数的总和。

例如:

如果n=3则正整数为1+3+5,总和为9

1 个答案:

答案 0 :(得分:4)

使用递归是不必要的开销,但这符合要求:

代码:(Demo

function sum_recursive($n){
    return ($n<<1)-1 + ($n>1 ? sum_recursive($n-1) : 0);
}

$number_of_odd_numbers=range(1,10);  // test cases
foreach($number_of_odd_numbers as $n){  // iterate test cases
    echo "$n => " , sum_recursive($n) , "\n";
}

功能逻辑:

  • 由于$n始终为1或更长时间,因此无法检查0
  • 在每次递归调用中,使用shift left bitwise operator(为了获得最佳效果)将$n乘以2(一次),然后减去1,并将该数字添加到递归调用中#39 ; s返回值。
  • $n减少到1时,停止递归并将0添加到计算中。

输出:

1 => 1
2 => 4
3 => 9
4 => 16
5 => 25
6 => 36
7 => 49
8 => 64
9 => 81
10 => 100

除了问题要求之外,纯粹的算术方法将非常快速和简短的代码(新学校风格少至5个字符):

pow($n,2)  // pow() is the old-school call

$n**2  // is new-school

实施:(Demo

$number_of_odd_numbers=range(1,10);  // test cases

foreach($number_of_odd_numbers as $n){  // iterate test cases
    echo "$n => " , pow($n,2) , "\n";
    //    ^^-input  ^^^^^^^^^--- square $n
}

输出:

1 => 1     // 1
2 => 4     // 1,3
3 => 9     // 1,3,5
4 => 16    // 1,3,5,7
5 => 25    // 1,3,5,7,9
6 => 36    // 1,3,5,7,9,11
7 => 49    // 1,3,5,7,9,11,13
8 => 64    // 1,3,5,7,9,11,13,15
9 => 81    // 1,3,5,7,9,11,13,15,17
10 => 100  // 1,3,5,7,9,11,13,15,17,19