1. 程式人生 > >《Lua程式設計(第4版)》:第6章練習答案

《Lua程式設計(第4版)》:第6章練習答案

練習6-1

function exercise6_1(array)
  for i=1,#array,1 do
    io.write(table.unpack(array,i,i)," ")
  end
end

練習6-2

function exercise6_2(num,...)
  local sp=table.pack(...)
  for i=1,#sp,1 do
    io.write(sp[i]," ")
  end
end

練習6-3

function exercise6_3(...)
  local sp=table.pack(...)
  for i=1,#sp-1,1 do
    io.write(sp[i]," ")
  end
end

練習6-4

經典洗牌演算法

function exercise6_4(tab)
  math.randomseed(os.time())
  for i=#tab,2,-1 do
    local randnum=math.random(i)
    local sp=tab[i]
    tab[i]=tab[randnum]
    tab[randnum]=sp
  end
  return tab
end

練習6-5

function exercise6_5(tab,begin)
  begin=begin or 0
  if begin==0 then
    exercise6_5_name=1
  end
  if exercise6_5_anstable==nil or begin==0 then
    exercise6_5_anstable={}
  end
  if exercise6_5_sptable==nil or begin==0 then
    exercise6_5_sptable={}
  end
  if begin==(#tab) then
    exercise6_5_anstable[exercise6_5_name]=table.move(exercise6_5_sptable,1,#exercise6_5_sptable,1,{})
    exercise6_5_name=exercise6_5_name+1
  else
    table.insert(exercise6_5_sptable,tab[begin+1])
    exercise6_5(tab,begin+1)
    table.remove(exercise6_5_sptable)
    exercise6_5(tab,begin+1)
  end
  return exercise6_5_anstable
end

返回一個序列,其中包含著若干個序列,是輸入序列元素的所有可能組合。

注意每次遞迴出現結果時,給序列賦值的應該是儲存臨時結果的表的克隆!

呼叫方法如下

array={1,2,3,4,5}
ans=exercise6_5(array)
for i=1,#ans do
  print(table.unpack(ans[i]))
end
print(#ans)

練習6-6

這題不太懂,個人感覺是動態語言的函式呼叫時,即使沒有使用遞迴所佔用的棧空間也不是確定的。

因為Lua函式的引數值、返回值和他們的型別都是不確定的。

先留個坑,以後補。

end