1. 程式人生 > >求1!+(1!+3!)+(1!+3!+5!)+...+(1!+3!+5!+7!+9!)的值

求1!+(1!+3!)+(1!+3!+5!)+...+(1!+3!+5!+7!+9!)的值

今天朋友面試時遇到一道演算法題,題目要求求出1!+(1!+3!)+(1!+3!+5!)+......+(1!+3!+5!+7!+9!)的值。我個人的思路是需要用到斐波那契階乘來解決這個問題。
這道題可以分為兩步來做,先寫出求階乘的方法,然後我們根據括號就能把上面分組,其實每一組的最大數就是組數*2-1,比如第二組(1!+3!)中的3就是由2 * 3 - 1得來的,第五組(1!+3!+5!+7!+9!)的9就是根據 2 * 5 - 1得來的,並且每一組的結果就是上一組的結果再加上本身最大數的階乘,所以這裡用到了斐波那契。
下面是用PHP實現的程式碼:

/**
 * 求一個數n的階乘
 * @param  int $n 要求階乘的數n
 * @return int    n!
 */
function factorial($n) {

    if($n <= 1) {
        return 1;
    }
    return $n * factorial($n-1);
}

//有上面的分析,我們要向得到組數就是一組裡面最後的那個數+1的結果再除以2就好了
$n = (9 + 1) / 2;

//定義一個arr陣列,用來儲存每一組的結果,陣列的下標代表組數
$arr = [];
$arr[1] = factorial(2*1 - 1);
$arr[2] = factorial(2*2 - 1) + $arr[1];

//斐波那契求每一組的結果
for ($i = 3; $i <= $n; $i++) {
    $arr[$i] = factorial(2*$i - 1) + $arr[$i-1];
}

//定義$result變數儲存最終結果
$result = 0;

for($i = 1; $i <= $n; $i++) {
    $result+= $arr[$i];
}

//輸出最終結果
echo $result;