列表與遞迴

2022-08-28 19:03:19 字數 2993 閱讀 3242

頭部和尾部

[head | tail ] = [1]        #head 1tail 

[head | tail ] = [1, 2, 3] #head 1 tail [2, 3]

[head | tail ] = #報錯

建立對映函式

我們可以使用乙個函式來處理列表中的各個元素,如此可以接受更加複雜的處理,也可以根據傳入函式的功能做不同的處理。

def map(, _func), do: 

def map([ head | tail ], func), do: [func.(head) |map(tail, func)]

example.map [1,2,3,4], fn n -> n * n end #[1, 4, 9, 16]

在遞迴過程中跟蹤值

我們的目標是使用不可變狀態,所以不能再乙個全域性變數或者模組級變數例儲存值。所以,我們以函式引數傳入

def sum(, total), do: total

def sum([head | tail], total), do sum(tail, total +head)

example.sum([1,2,3,4], 0) #10#我們總要傳入乙個初始值,可以如下改進

def sum(list), do: sum(list, 0)

defp _sum(, total), do: total

defp _sum([head | tail], total), do: sum(tail, total + head)

使用函式解決問題

def reduce(, value, _), do: value

def reduce([head | tail], value, func), do: reduce(tail, func.(head, value), func)  #使用匿名函式時在引數列表前加乙個點(.)

example.reduce

更複雜的列表

#交換相近的兩個資料,若是單數個資料就報錯

def swap(), do:

def swap([a, b | tail]), do: [b, a |swap(tail)]

def swap([_]), do: raise "can`t swap a list with an odd number of elements"

可以使用[a, ..., x | tail]匹配一組資料

# [ timestamp, location_id, temperature, rainfall ]  這組資料表示天氣

# 版本一

def for_location_27(), do:

def for_location_27([ [ time, 27, temp, rain ] | tail ]) do

[ [ time, 27, temp, rain ] |for_location_27(tail) ] #篩選出location_id為27的一組資料

enddef for_location_27([ _ | tail ]), do: for_location_27(tail) #跳過格式不匹配的一組資料中的乙個

#版本二

#更具傳入資料進行篩選

def for_location(, _target_loc), do:

def for_location([ [ time, target_loc, temp, rain ] | tail ], target_loc) do

[ [ time, target_loc, temp, rain ] | for_location(tail, target_loc) ]

enddef for_location([ _ | tail ], target_loc), do: for_location(tail, target_loc)

#版本三

#將匹配函式簡化為:

def for_location( head = [ _, target_loc, _, _ ] | tail ], target_loc ), do: [ head | for_location(tail, target_loc) ]

list模組提供的函式

連線。[1, 2, 3] ++ [4, 5, 6]

一維化。list.flatten([[[1], 2], [[[3]]]])  => [1, 2, 3]

摺疊。list.foldl([1, 2, 3], "", fn value, acc -> "#(#)" end )     =>3(2(1()))

list.foldr([1, 2, 3], "", fn value, acc -> "#(#)" end )     =>1(2(3()))

合併、拆分。l = list.zip([ [1, 2, 3], [:a, :b, :c], ["cat", "dog"] ] )    =>[ , ]

list.unzip( l )        => [ [ 1, 2 ], [ :a, :b ], [ "cat", "dog" ]

在列表裡訪問元組。kw = [ , , ]

list.keyfind(kw, :name, 0)    引數:列表,元組中資料值,數字在元組中的下標

list.keyfind(kw, "tx", 2)   

list.keyfind(kw, "tx", 1)   nil

刪除元組。list.keydelete(kw, "tx", 2)

替換元組。list.keyreplace(kw, :name, 0, )

遞迴巢狀列表

乙個多表的建立 該列表儲存在目錄 並輸出的專案列表 例如下面的附圖 能夠看出輸出的僅僅是輸出了外列表 當然也能夠多次迴圈輸出每個子項 例如以下圖所看到的 注 isinstance object,classinfo 為python的內建函式,用來推斷物件的型別 這是三層迴圈,假設是非常多次迴圈再用fo...

reactl列表 react中遞迴生成列表

import react,from react import from antd import from react router dom const menulist title 首頁 選單標題名稱 key home 對應的 path icon home 圖示名稱 title 商品 key pro...

遞迴處理多層巢狀列表

建立乙個多層列表 即列表中儲存列表 並輸出列表項 如下圖 可以看出輸出的只是輸出了外列表 當然也可以多次迴圈輸出每乙個子項 如下圖所示 注 isinstance object,classinfo 為python的內建函式,用來判斷物件的型別 這是三層迴圈,如果是很多次迴圈再用for迴圈輸出就太麻煩了...