1. 程式人生 > >階乘演算法和斐波那契陣列

階乘演算法和斐波那契陣列

研究演算法,寫了一些網上沒有的演算法,大家看看有沒有錯誤! 

/**
 * @param $n
 * @return int
 * 階乘(非遞迴)
 */
function factorial($n){
    $res = 1;
    for($i=1;$i<=$n;$i++){
        $res *= $i;
    }
    return $res;
}

/**
 * @param $n
 * @param int $num
 * @return float|int
 * 正向階乘(遞迴)
 */
function factorial2($n,$num = 1){
    $res = 1;
    if($n>$num){
        $num++;
        $res *= $num;
        $res = factorial2($n,$num)*$res;
    }
    return $res;
}

/**
 * @param $n
 * @return float|int
 * 反向階乘(遞迴)
 */
function factorial3($n){
    $res = $n;
    if($n>1){
        $n--;
        $res *= factorial2($n);
    }
    return $res;
}

/**
 * @param $n
 * @return float|int
 * 反向階乘(遞迴)
 */
function factorial4($n){
    if($n == 1){
        return 1;
    }
    return $n*factorial2($n-1);
}

/**
 * @param $num
 * @return array
 * 斐波那契(非遞迴)
 */
function fibonacci($num){
    $arr = [1,1];
    if($num == 1){
        return [1];
    }
    if($num == 2){
        return $arr;
    }
    if($num>=3){
        for($i=2;$i<$num;$i++){
            $arr[$i] = $arr[$i-1]+$arr[$i-2];
        }
    }
    return $arr;
}

/**
 * @param $num
 * @param int $key
 * @param array $arr
 * @return array
 * 斐波那契(遞迴)
 */
function fibonacci2($num,$key = 2,$arr = [1,1]){
    if($num == 1){
        return [1];
    }
    if($num == 2){
        return $arr;
    }
    if($num>=3){
        $arr[$key] = $arr[$key-1]+$arr[$key-2];
        $key++;
        if($key<$num){
            $arr = fibonacci2($num,$key,$arr);
        }
    }
    return $arr;
}

/**
 * @param $num
 * @return array
 * 斐波那契(遞迴)
 */
function fibonacci3($num){
    $arr = [1,1];
    if($num == 1){
        return [1];
    }
    if($num == 2){
        return $arr;
    }
    $tmparr = fibonacci3($num-1);
    $tmparr[] = $tmparr[$num-2]+$tmparr[$num-3];
    return $tmparr;
}