【读书笔记】语言基础-表 练习(九)

练习1. 下列代码的输出是什么?为什么?

sunday = "monday"; monday = "sunday"
t = {sunday = "monday", [sunday] = monday}
print(t.sunday, t[sunday], t[t.sunday])

解:

--> monday sunday sunday

        t.sunday 相当于调用表结构体中的 sunday; t[sunday] 形式 采用了方括号表达式,显示指定了 sunday 索引,由于 sunday 索引的元素是 monday变量, 指向了"sunday"

        字符串 ”sunday“; t[t.sunday] 相当于 t["monday"] , 由于 [sunday] = monday 等同于 "monday" = monday,所以结果为sunday

练习2. 考虑如下代码:

a = {}; a.a = a

a.a.a.a 的值是什么?其中的每个a都一样嘛?

如果将如下代码追加到上述的代码中:

a.a.a.a = 3

现在的a.a.a.a的值变成了什么?

解:

a
a.a
a.a.a
a.a.a.a 都指向同一个表

执⾏a.a.a.a=3即指定该表关键字为字符串“a”的值为3,这时候再执⾏a.a.a.a会发⽣错误,因为a.a的值为3

练习3:假设要创建一个以转义序列为值、以转义序列对应字符串为键的表,请问应该如何编写构造器?

解:

={["\a"]="\007",["\t"]="\009",["\n"]="\010

练习4:在Lua语言中,我们可以使用由系数组成的列表{a0, a1, ...., an}来表达多项式

请编写一个函数,该函数以多项式(使用表表示)和值x为参数,返回结果为对应多项式的值。

 解:

function polynomial(Coefficient, x)
--假设多项式是3x^5+4x^4-2x^3+8x^2-x^1+9
local tab = {3, 4, -2, -1, 9}

local sum=0
for i=1,#tab do
  sum=sum+tab[i]*(x^(#tab-i))
end
return sum
end
print()

练习5:改写上述函数,使之最多使用n个加法和n个乘法(且没有指数)

 解:

--[[
假设多项式是
3x^5+4x^4-2x^3+8x^2-x^1+9
]]
function polynomial(x)
 tab={9,-1,8,-2,4,3}
local sum=0
local product=1
for i=1,#tab do
  sum=sum+tab[i]*product
  product=product*x
end
return sum
end

练习6:请编写一个函数,该函数用于测试指定的表是否为有效的序列。

 解:

--因为相对于pairs(),ipairs()不会遍历键值对,并且遇到nil会停下,但是pairs()会输出nil且继续,并且会遍历键值对

function IsSequence(tab)
  i=0
  j=0
  for index inpairs(tab)do
    i=i+1
  end
  for index inipairs(tab)do
    j=j+1
  end
  if i~=j then
   return false
  else
    return true
   end
end

练习7:请编写一个函数,该函数将指定列表的所有元素插入到另一个列表的指定位置。

 解:

function TotalInsert(tab1,tab2,index)
    for i=1,#tab1 do
      table.insert(tab2,index,tab1[i])
      index=index+1
    end
end

练习8:表标准库中提供了函数 table.concat,该函数将指定表的字符串元素连接在一起:

 解:

print(table.concat({"hello", " ", "world"}}))	--> hellow world

实现该函数,并比较在大数据量(具有上百万个元素的表,可利用for循环生成)情况下与标准库之间的性能差异。

function Concatenate(tab,start,over)
 str="\0"
 for i=start,over do
  str=str..tab[i]
 end
 return str
end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值