1. 程式人生 > >從漢諾塔上寫遞歸

從漢諾塔上寫遞歸

from img 調用方法 ret one func create null parent

技術分享圖片

需求: 求出每一級的數量,但是父級+子級的所有數量。

比如 第一級本身數量為1 而子級是2 ,那麽相加就是3,但是2級還有3級,就需要再加上3級。依次類推到最後一級數量之和就是這個分類的總數量。

實現的思路:

1:我們需要找到自身的數量.

2.1:我們找到自身的下一級所有數量相加 ,返回數量.

2.2:子級再去調用方法1,這樣最後累加。

代碼:

class Test
{
    public static function  getAllData()
    {
        echo ‘<pre>‘;
        $data=[];
        self::_getData($data
,‘1‘); var_dump($data);exit; } //獲取自身+子級 private static function _getData(&$data,$id) { $item = self::_getDataById($id); if ($item==null) { return 0; } array_push($data,$item); $tem_key = count($data)-1; $child_amount
= 0; $child_item= self::_getChildrenData($id); foreach ($child_item as $item) { $amount = self::_getData($data,$item[‘id‘]); $child_amount +=$amount; } $data[$tem_key][‘amount‘]+=$child_amount; return $data[$tem_key][‘amount‘]; }
//獲取自身 private static function _getDataById($id) { $sql=‘SELECT * FROM category WHERE id=:id‘; $cmd = \Yii::$app->db->createCommand($sql); $cmd->bindValue(‘:id‘, $id); return $cmd->queryOne(); } //獲取子級 private static function _getChildrenData($id) { $sql=‘SELECT * FROM category WHERE parent_id=:id‘; $cmd = \Yii::$app->db->createCommand($sql); $cmd->bindValue(‘:id‘, $id); return $cmd->queryAll(); } }

部分結構:

技術分享圖片

從漢諾塔上寫遞歸