函数在循环的最后返回了 nil 值,但是功能正常

这个函数的功能正常,直到我尝试让它返回一个包含 2 个元素的表时,它会返回 nil。

我使用的是 ZeroBrane Studio,使用的是我认为最新的 Lua 版本。

function round(n)
  local up = math.ceil(n)
  if up - (n + 0.5) <= 0 then return math.ceil(n)
  else return math.floor(n) end
end
function neighbors(t, x)
  local mid = round(#t/2)
  local tt = {}
    if #t == 2 then
      print("完成搜索; 返回 {"..t[1]..", "..t[2].."}。")
      return t
    end
    if x >= t[mid] then
      for i = mid, #t do
        table.insert(tt, t[i])
      end
    elseif x < t[mid] then
      for i = 1, mid do
        table.insert(tt, t[i])
      end
    end
  print(table.concat(tt, ", "))
  neighbors(tt, x)
end
test = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24}

nn = neighbors(test, 14.25)
print(nn)

我期望的调试输出是 "table: 0x000291f8" 或类似的东西,但实际上我得到了 nil。

点赞
用户7396148
用户7396148

你的 neighbors 函数结尾缺失了 return,应该是:

  return neighbors(tt, x)

你的错误在于程序第11行返回的 t 值并不会一直返回给所有递归调用,而是仅返回给调用了 neighbors 的最后一个函数。

添加 return neighbors(tt, x) 会导致确实接收到 t 值的调用将该值一直返回到 neighbors 的第一次调用。


下面是一个常见递归程序的简单示例:

function factorial(n)
    if (n == 0) then
        return 1
    else
        return n * factorial(n - 1) --注意,我们返回这一行而不仅仅调用它。
    end
end
2019-08-31 15:36:15