JavaScript:用于查找链接列表节点的递归函数返回错误的节点

时间:2016-02-05 12:30:14

标签: javascript function recursion linked-list

为了更好地理解递归,我决定尝试使用递归函数来查找链表中的项而不是while循环。

接近结束时,我的递归函数似乎通过返回正确的节点做了正确的事情,但然后它运行了多次意外返回(我不知道为什么)并返回一个不正确的对象。我错过了什么吗?

var linkedList = {
  element: 'head',
  next: {
    element: 'SF',
    next: {
      element: 'LA',
      next: {
        element: 'SD',
        next: {
          element: 'NY',
          next: null
        }
      }
    }
  }
}


function getItem(city, list) {
  var item = list

  if (item.element != city) {
    item = item.next
    getItem(city, item)
  }

  return item
}

console.log( getItem('SD', linkedList ) ) // logs "SF" node but I expect "SD" node

3 个答案:

答案 0 :(得分:6)

你的功能应该是这样的:

SELECT myT.*, AVG(NumberOfOrders) FROM(

    SELECT Shippers.ShipperName,COUNT(Orders.OrderID) AS NumberOfOrders FROM Orders
    LEFT JOIN Shippers
    ON Orders.ShipperID=Shippers.ShipperID
    GROUP BY ShipperName;

) myT

这是一般模式:

function getItem(city, item) {
  if(item === null)
    return null;
  if (item.element === city)
    return item;
  return getItem(city, item.next)
}

答案 1 :(得分:3)

你应该在if。

中捕获递归函数的返回值

只做

if (item.element != city) {
    item = item.next
    item = getItem(city, item)
}

它按预期工作。

答案 2 :(得分:2)

关键是你在迭代中创建了“item”变量。当你进入下一个调用时,你丢失了父进程的值,因为eu再次注册它,所以你必须在函数外创建它并使用里面的引用。看:

function do_upload(){//This is my controller//
    $config['upload_path'] = './uploads/';
    $config['allowed_types'] = 'gif|jpg|png';
    $config['overwrite'] = true; 
    //$config['max_size']   = '100';
    //$config['max_width']  = '1024';
    //$config['max_height']  = '768';
    $this->load->library('upload');
    $this->upload->initialize($config);
    $this->upload->do_upload();
    if (!$this->upload->do_upload()){//I also found out that this is the part that is not working
        echo "failed!";
    }
    else{
        $this->upload->data();
        echo "success!";
    }
}