求解一个上楼梯算法
lua吧
全部回复
仅看楼主
level 1
自大宇1e 楼主
楼梯有n阶台阶,上楼可以一步上1阶,也可以一步上2阶,编一程序列出每一种走法。
例:3阶台阶的走法是
{
{ 1, 1, 1, },
{ 1, 2, },
{ 2, 1, },
}
2014年06月09日 00点06分 1
level 1
自大宇1e 楼主
要求是使用lua语言解出下题,分别用递归、迭代二种方式, 写出详细的代码:
2014年06月09日 00点06分 2
level 1
这口气 好像别人欠他似的[揉脸]
2014年06月09日 01点06分 3
level 13
前段时间就看到小吧艾特我了,但是因为工作太忙,上个周末家里又有事情,所以一直没做这个题,今天有点时间,看到这个问题又有人问,就解答一下。
递归算法还是很有意思的,所以用递归解了一下。迭代就算了,有兴趣的朋友可以做一下,原理一样的。
算法里面将n设置为6,解出了n=6的所有解。如果想算其他的,将这个地方的值换一下,或者改成控制台输入即可,懒得弄了。
详细解法见楼下。
@矮番薯_爱翻书
2014年06月21日 14点06分 5
level 13
-- 克隆(复制)一个二重表的所有内容
function cloneTable(tbl)
local newtbl = {}
for i,v in ipairs(tbl) do
newtbl[i] = {}
for _,v1 in ipairs(v) do
table.insert(newtbl[i],v1)
end
end
return newtbl;
end
-- 合并两个表
function mergeTable(des,src)
for _,v in ipairs(src) do
table.insert(des,v)
end
return des
end
-- 将一个表中的各子表均加入新的元素num
function allInsert(tbl,num)
for _,v in ipairs(tbl) do
table.insert(v,num)
end
end
function steps(tbl,num)
if (num == 0) then
return tbl
elseif (num == 1) then
allInsert(tbl,1)
return tbl
else
local newTbl = cloneTable(tbl)
allInsert(tbl,1)
local tbl1 = steps(tbl,num-1)
allInsert(newTbl,2)
local tbl2 = steps(newTbl,num-2)
return mergeTable(tbl1,tbl2)
end
end
function main ()
n = 6
array = {{}}
result = steps(array,n)
for _,v in ipairs(result) do
str = "{"
for i=1,#v do
str = str .. v[i]
if (i~=#v) then
str = str .. ","
end
end
print (str .. "}")
end
end
main()
-------------------------------------------------------
结果如下:
{1,1,1,1,1,1}
{1,1,1,1,2}
{1,1,1,2,1}
{1,1,2,1,1}
{1,1,2,2}
{1,2,1,1,1}
{1,2,1,2}
{1,2,2,1}
{2,1,1,1,1}
{2,1,1,2}
{2,1,2,1}
{2,2,1,1}
{2,2,2}
2014年06月21日 14点06分 6
回复 矮番薯_爱翻书 :必须做克隆啊,因为如果你简单赋值:newTable = oldTable,这样是传地址的,两边会同时改变,达不到要求。
2014年06月22日 05点06分
level 13
没有缩排很难看清,我截个图吧
2014年06月21日 15点06分 7
level 13
仔细看了一下,main()函数中, n,array,result,str这几个变量前面都应该加上local限制为局部变量为好,除非特别需要,正常情况下都应该将变量设置为局部变量。
最近一直在写C++代码,所以写lua的时候经常忘记加local .
修改后的main函数如下:
function main ()
local n = 6
local array = {{}}
local result = steps(array,n)
for _,v in ipairs(result) do
local str = "{"
for i=1,#v do
str = str .. v[i]
if (i~=#v) then
str = str .. ","
end
end
print (str .. "}")
end
end
2014年06月21日 15点06分 8
level 13
经过小吧主提示,克隆可以用unpack实现,这样程序能更简洁一些。第一个函数改写如下:
-- 克隆(复制)一个二重表的所有内容
function cloneTable(tbl)
local newtbl = {}
for i,v in ipairs(tbl) do
newtbl[i] = {unpack(v)}
end
return newtbl;
end
2014年06月22日 05点06分 9
[乖]求解一下怎么在Sublime text2 新建一个Lua
2014年06月25日 13点06分
回复 fusky125 :新建后缀名改为.lua
2014年07月16日 01点07分
回复 久月阳光 :终于有人回我了,这吧多冷清啊
2014年07月16日 03点07分
回复 fusky125 :主动一点 ,就不用等别人的答案了 [花心]
2014年07月21日 02点07分
level 4
其实可以把这个问题,当作一个二叉树的问题求解也许更高效!求一个跟节点为0,左孩子为2,右孩子为1的一个二叉树的路径和为n的所有路径。
2014年12月07日 04点12分 10
用lua实现树这种结构感觉很难弄,不如直接用c来的好[太开心]
2014年12月07日 11点12分
嗯,我是lua菜鸟,有了这个想法后想去实现,发现用lua实现二叉树貌似很复杂。如果是C++,二叉树实现来应该就方便多了
2014年12月09日 03点12分
想法好棒!!
2014年12月09日 17点12分
level 11
empty = {}
do
local cache = {}
cache[1] = {{1,empty}}
cache[2] = {{1,cache[1]},{2,empty}}
function find(n)
cache[n] = cache[n] or {
{1,find(n-1)},
{2,find(n-2)}
}
return cache[n]
end
end
do
local cache = {}
cache[empty] = {{}}
function flush(list)
if cache[list] then return cache[list] end
cache[list] = {}
local c = cache[list]
for i,item in ipairs(list) do
local sub = flush(item[2])
for _,slv in ipairs(sub) do
table.insert(c,{i,unpack(slv)})
end
end
return c
end
end
function start(n)
local list = flush(find(n))
local output = "\n{\n"
for _,l1 in ipairs(list) do
output = output.." {"
for _,l2 in ipairs(l1) do
output = output..l2..','
end
output = output..'}\n'
end
output = output.."}"
print(output)
end
start(6)
用手机写了一个……感觉咱的思路是做成了树型……莫名觉得空间开销很大
   ——阿空核动力股份有限公司出品
2014年12月07日 15点12分 11
level 13
一个问题引出多种解答,很好。我和11楼@同在二要 的接解法都是先将整个结果计算出来然后一次性输出,这样计算效率高但是占用的空间随着N的增大会指数增大。14楼@New_Test_Linux 的解法试图做到计算空间和计算时间的平衡,每算出一组解就输出,相当好的思路,不过算法似乎有点凌乱,反正我粗看了一下没太看懂,应该还有优化的空间。
特别提一下12楼find函数的写法,深得LUA语音的精髓,相当精彩,赞一个[大拇指]
2014年12月15日 15点12分 15
说错了,是11楼的find函数。
2014年12月15日 15点12分
[乖]
2014年12月15日 16点12分
level 2
尝试了一下,太不爽了 ...
2014年12月19日 09点12分 16
level 13
笑一个
2014年12月20日 21点12分 17
level 4
function dfibl(str,n)
if n<1 then
print(str)
return
end
if n==1 then
print(str.."1")
return
end
dfibl(str.."1",n-1)
dfibl(str.."2",n-2)
end
print(dfibl("",4))
网上找到java版本,转成lua就这样了
2014年12月30日 02点12分 18
level 1
数学问题,x+2y=n的所有非负整数解。
然后将x个1,y个2进行排列组合。
2015年06月08日 01点06分 19
1