php實現風車型數據排列問題

題目:

<?php
// 實現一個function foo($num) 完成如下功能
//
// foo(1) = [[1]];
// foo(2) = [ [1,2]
//            [4,3]  ];
// foo(3) = [ [7,8,9]
//            [6,1,2]
//            [5,4,3] ];
// foo(4) = [ [7,8,9,10]
//            [6,1,2,11]
//            [5,4,3,12]
//            [16,15,14,13] ];
//
// foo(5)....
//
// foo(n)...
//依次類推,組成一個風車型排列
//
//
$num = 10;
$arr = foo($num);
for( $i = 0; $i < $num ; $i ++  ){
    echo implode(", ", $arr[$i]) . "\n";
}

function foo($num){
    //TODO 實現代碼
    //TODO 實現代碼
    //TODO 實現代碼
    //TODO 實現代碼
    //TODO 實現代碼
    //TODO 實現代碼
    //TODO 實現代碼
    //TODO 實現代碼
    //TODO 實現代碼
    //TODO 實現代碼
    return [[1,2], [4,3]];
}
 

何爲風車型數據?

實現效果:

實現過程:

1.foo(num)和num的關係,結果集子數組的數目=num,結果集總元素的個數=num*num,都是從1開始排列

2.foo(num)是包含foo(num-1)的,結果集是隨着num遞增的

3.foo(num)相比較foo(num-1),多了一組子數組,且每列子數組增加了一個元素,num爲偶數時,子數組排列在子數組尾部且降序排列,每組子數組尾部新增了一個新元素;num爲奇數時則相反,子數組排列在子數組頭部且升序,每組子數組頭部新增一個元素

4.根據以上觀察,函數應使用遞歸算法

 $num = 10;
    $arr = foo($num);
    for( $i = 0; $i < $num ; $i ++  ){
        echo implode(", ", $arr[$i]) . "\n";
    }
    
    function foo($num){
        if($num<=1){
            return [[1]];
        }
        $arr= range(1,$num*$num);
        $arr_chunk = array_chunk($arr,$num);//平均拆分
        $list_before = foo($num-1);//遞歸調用上一個數組
        $list = [];//當前數組
        if($num % 2 ==0){
            $list_add = array_slice($arr,count($list_before)*count($list_before));//截取較上一個數組新增的元素
            foreach($list_before as $k=>$v){
                array_push($v,$list_add[$k]);//原數組子數組尾部添加一位元素
                $list[] = $v;
            }
            $arr_end = $arr_chunk[count($arr_chunk)-1];//獲取最後一組,也是最大的一組
            rsort($arr_end);//降序
            array_push($list,$arr_end);//原數組尾部增加一子降序數組
        }else{
            foreach($list_before as $k=>$v){
                array_unshift($v,$num*($num-1)-$k);//原數組子數組隊首添加一位元素
                $list[] = $v;
            }
            array_unshift($list,$arr_chunk[count($arr_chunk)-1]);//原數組隊首增加一子升序數組
        }
        return $list;
    }

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章