为了更好地理解递归,我决定尝试使用递归函数来查找链表中的项而不是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
答案 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!";
}
}