題目:
<?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;
}