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

时间:2019-09-03 01:52:51

标签: lua

我创建了一个函数,该函数(伪)随机创建一个包含数字的表。然后,我循环执行此功能,直到至少找到正确的结果。一旦我确认至少存在一个这样的结果,就停止该函数并返回表。

当我创建包含较小值的表时,没有问题。但是,一旦随机数增加到几百个范围,即使表在返回之前的行为true,函数也会开始返回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 = {}

    -- Generate a random length table, containing random number values.
    for i = 1, random( aMin, aMax ) do
        numbers[i] = random( bMin, bMax )
    end
    sort( numbers, compare )

    -- See if a specific sequence of numbers exist in the table.
    for i = 2, #numbers do
        if numbers[i-1]+1 == numbers[i] or numbers[i-1] == numbers[i] then
            -- Sequence found, so stop.
            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( "Within function:", numbers )
        return numbers
    else
        getNumbers()
    end
end

local numbers = getNumbers()
print( "Outside function:", numbers )

据我所知,该函数应该无限循环直到找到有效序列为止。根据我的代码,该函数甚至可以终止的唯一方法是有效是否为真。

有时,对于大型函数,很多时候(通常)仅向函数外部输出一个nil值。这是怎么回事?

2 个答案:

答案 0 :(得分:3)

您只是在进行getNumbers()而不是return getNumbers()的递归操作。这意味着,如果输入了递归,则无论其他情况如何,最终返回的值都是nil

答案 1 :(得分:3)

else的{​​{1}}情况下,您什么都不返回。在if valid then情况下,您只能return进行任何操作。在valid情况下,递归调用可能返回某些内容,但随后您将忽略该返回值。您看到的打印内容与递归调用的返回结果相对应;它并没有打出原始电话。

您的意思是else