markov chain
local MAXGEN = 10000
local NOWORD = '\n'
function allwords()
local w1 = NOWORD
local w2 = NOWORD
-- test.txt is a txt file
for line in io.lines("test.txt") do
local pos = 1
while line do
local s,e = string.find(line, "%w+", pos)
if s then
local value = string.sub(line, s, e)
insert(prefix(w1, w2), value)
pos = e + 1
w1 = w2
w2 = value
else
break
end
end
end
insert(prefix(w1, w2), NOWORD) -- the last word
end
function prefix(word1, word2)
return word1 .. " " .. word2
end
function insert(index, value)
local list = statetab[index]
if list == nil then
statetab[index] = {value}
else
list[#list + 1] = value
end
end
statetab = {}
allwords()
--[[
for k,v in pairs(statetab) do
print(string.format("%s: \n", k))
for k1, v1 in pairs(v) do
print(string.format("\t%d : %s\n", k1, v1))
end
end
--]]
-- generate text
local w1 = NOWORD
local w2 = NOWORD
for i=1,MAXGEN do
local list = statetab[prefix(w1, w2)]
local random = math.random(#list)
local next_word = list[random]
if next_word == NOWORD then
io.write(next_word)
return
end
io.write(next_word, " ")
w1 = w2
w2 = next_word
end
递归
上楼梯,可以一步一个台阶,也可以一步两个台阶,求出n阶台阶的所有方法
方法一:
function up_stair(total, step)
if total==nil then
return false
end
if total==1 then
io.write(step .. " 1\n")
return
elseif total==2 then
io.write(step .. " 1 1\n")
io.write(step .. " 2\n")
return
end
up_stair(total-1, step .. " " .. 1)
up_stair(total-2, step .. " " .. 2)
end
方法二:
function up_stair(total)
if total==nil then
return false
end
if total==0 then
return true
elseif total<0 then
return false
end
if up_stair(total-1) then
io.write(1 .. " ")
end
if up_stair(total-2) then
io.write(2 .. " ")
end
return true
end
方法二需要优化,因为输出结果是树形方式列出来的,但是列出的一行,所以不易看懂