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