Lua函数如何返回 nil,即使函数内部返回值不是 nil?

我创建了一个函数,通过随机生成包含数字的表。我反复调用这个函数,直到找到至少一个正确的结果为止。一旦我确认至少存在一个这样的结果,我就停止函数并返回表格。

当我创建包含小数值的表格时,没有任何问题。然而,一旦随机数增加到数百范围,函数就开始返回 nil,即使在返回前该表格是正确的。

local sort = table.sort
local random = math.random

local aMin, aMax = 8, 12
local bMin, bMax = 200, 2000

local function compare( a, b )
    return a < b
end

local function getNumbers()
    local valid = false
    local numbers = {}

    -- 生成一个随机长度的表格,包含随机数值。
    for i = 1, random( aMin, aMax ) do
        numbers[i] = random( bMin, bMax )
    end
    sort( numbers, compare )

    -- 检查表格中是否存在特定的数列。
    for i = 2, #numbers do
        if numbers[i-1]+1 == numbers[i] or numbers[i-1] == numbers[i] then
            -- 找到数列,停止。
            valid = true
            break
        end
    end

    for i = 1, #numbers-1 do
        for j = i+1, #numbers do
            if numbers[j] % numbers[i] == 0 and numbers[i] ~= 1 then
                valid = true
                break
            end
        end
    end

    if valid then
        print( "函数内部:", numbers )
        return numbers
    else
        getNumbers()
    end
end

local numbers = getNumbers()
print( "函数外部:", numbers )

据我理解,这个函数应该无限循环,直到我找到一个有效的数列。根据我的代码,函数结束的唯一方式是 valid 为 true。

有时,特别是在使用大数值时,函数会简单地输出一个 nil 值。这里发生了什么?

点赞
用户7509065
用户7509065

你只是在getNumbers()中使用递归而不是return getNumbers()。这意味着如果进入递归,最终返回的值将无论如何都是nil

2019-09-03 01:55:17
用户2616735
用户2616735

if valid thenelse 情况下,您没有返回任何内容。您只在 valid 情况下返回任何内容。在 else 情况下,递归调用可能会返回一些东西,但是您会忽略该返回值。您看到的打印输出对应于递归调用返回的内容;它没有传递给原始调用。

您意思是 return getNumbers()

2019-09-03 01:59:11