码迷,mamicode.com
首页 > 其他好文 > 详细

lua解上阶梯问题(按指定格式输出具体走法、迭代、递归)

时间:2014-07-12 20:33:13      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:lua   迭代   递归   

问题描述

楼梯有n阶台阶,上楼可以一步上1阶,也可以一步上2阶,编一程序列出每一种走法。

思路

注释均在代码中

其它

第一次接触lua,很好的脚本语言

源代码

--[[--------------------------------------------------------------------------
表复制:深复制
--]]--------------------------------------------------------------------------
function table.copy(t)
	local t2 = {};

	for k,v in pairs(t) do
		if type(v) == "table" then
			t2[k] = table.copy(v);
		else
			t2[k] = v;
		end
	end

	return t2;
end

--[[--------------------------------------------------------------------------
格式化:将表转为字符串
用于格式化输出
--]]--------------------------------------------------------------------------
function table.formatout(t, h)
	local out = "";

	for k,v in pairs(t) do
		if type(v) == "table" then

			if k == 1 then
				for i = 1, h do out = string.format("%s%s", out, "  "); end
				out = string.format("%s%s", out, "{\n");
			end
			out = string.format("%s%s", out, table.formatout(v, h+1));

			if k == table.getn(t) then
				for i = 1, h do out = string.format("%s%s", out, "  "); end
				out = string.format("%s%s", out,"},\n");
			end

		else

			if k == 1 then
				for i = 1, h do out = string.format("%s%s", out, "  "); end
				out = string.format("%s%s", out, "{");
			end
			out = string.format("%s%d,", out, v);

			if (k == table.getn(t)) then
				out = string.format("%s%s",out,"},\n");
			end
		end
	end

	return out;
end

--[[--------------------------------------------------------------------------
格式化输出
--]]--------------------------------------------------------------------------
function table.print(t)

	local out = table.formatout(t, 0);
	--去掉最后的",\n"两个字符
	print(string.sub(out, 1, string.len(out)-2));

end


--[[--------------------------------------------------------------------------
@param
	solution_new	@format		{{1,2,1} {2,1,1} {1,1,1,1}}
					@meaning	插入值后的新解
	solution		@format 	{{1,2} {2,1} {1,1,1}}
					@meaning	特定n值下,所有的解,每一个元素为一种解
	value			@format		整数
					@meaning	需要插入的值,如1 2
@exmple
	输入状态:
	solution_new 	== 	{}
	solution 		== 	{{1,2} {2,1} {1,1,1}}
	value	 		==	1
	运行函数后:
	solution_new 	=	{{1,2,1} {2,1,1} {1,1,1,1}}

--]]--------------------------------------------------------------------------

function update_solution(solution_new, solution, value)

	local str = string.format("%d", value)	--将数值转为字符

	table.foreach(solution, function(idx,ele) table.insert(ele, str) table.insert(solution_new, ele) end)

end

--[[
solution : n级阶梯所有可行解 {{}, {}, {}}
]]--
function f_digui(n)

	local solution = {}

		if n == 1 then
			solution = {{1}}
		elseif n == 2 then
			solution = {{1,1},{2}}
		else
			solution = {}
			update_solution (solution, f_digui(n-2), 2);
			update_solution (solution, f_digui(n-1), 1);
		end

	return solution
end


--[[
solution : 1到n级阶梯所有可行解 {{{}, {}, {}}, {{}, {}, {}} }
solution[i] :i级阶梯所有可行解 {{}, {}, {}}
从这里可以看到,迭代需要使用更多的空间来保存数据
]]--
function f_diedai(n)
	local solution = {}


	for i_n = 1, n do

		if i_n == 1 then
			solution[i_n] = {{1}}
		elseif i_n == 2 then
			solution[i_n] = {{1,1},{2}}
		else
			solution[i_n] = {}
			update_solution (solution[i_n], table.copy(solution[i_n-2]), 2);
			update_solution (solution[i_n], table.copy(solution[i_n-1]), 1);
		end

	end

	return solution[n]
end



--[[
n依次从starti变化到endi
输出每个n值的组合
]]--
function test(starti, endi, fuc)

	for i = starti, endi, 1 do

		local array={}
		print()
		print("n的值:",i)

		if fuc == "digui" then
			table.print(f_digui(i))
		else
			table.print(f_diedai(i))
		end

	end

end

----------------------------------------------------------------------------------

--test(3,4, "digui");
--test(1,4, "diedai");
--table.print({{{1,2},{3,4}},{{1,2},{3,4}}});
out = "Hello lua!\n这是第一个lua代码,用来解决上楼梯问题\n有几个不错的地方:\n1、递归和迭代的转换\n2、表的复制和表的输出\n3、一些基本语法的使用";
print(out);
test(4, 4, "diedai");






----------------------------------------------------------------------------------
--[[
所有变量默认是全局变量
局部变量需要使用local
]]--

--[[
lua中的函数参数是“引用”
即:在函数中改变该参数的值,会导致该变量改变
]]--

--[[
(代码规范性——作为参考)
一般来说,所有编程语言的函数都不应该返回有意义的值
需要得到的结果通过参数保存
例如在update_solution函数中,我们需要得到的是solution_new
将它作为一个参数,而不要采用return solution_new的形式
返回一般是错误代码,用于错误控制,表示该函数是否正常执行

如果需要返回有意义的值,函数名应命名为get_***
或者,若不返回有意义的值,会使得函数难以理解,也可以返回该值
例如在递归函数f_digui当中
]]--


lua解上阶梯问题(按指定格式输出具体走法、迭代、递归),布布扣,bubuko.com

lua解上阶梯问题(按指定格式输出具体走法、迭代、递归)

标签:lua   迭代   递归   

原文地址:http://blog.csdn.net/hsylx1992/article/details/37671863

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!