我创建了一个函数,该函数(伪)随机创建一个包含数字的表。然后,我循环执行此功能,直到至少找到正确的结果。一旦我确认至少存在一个这样的结果,就停止该函数并返回表。
当我创建包含较小值的表时,没有问题。但是,一旦随机数增加到几百个范围,即使表在返回之前的行为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值。这是怎么回事?
答案 0 :(得分:3)
您只是在进行getNumbers()
而不是return getNumbers()
的递归操作。这意味着,如果输入了递归,则无论其他情况如何,最终返回的值都是nil
。
答案 1 :(得分:3)
在else
的{{1}}情况下,您什么都不返回。在if valid then
情况下,您只能return
进行任何操作。在valid
情况下,递归调用可能返回某些内容,但随后您将忽略该返回值。您看到的打印内容与递归调用的返回结果相对应;它并没有打出原始电话。
您的意思是else
。