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;
    }

 

 

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