簡體   English   中英

Haskell關於列表函數中的遞歸

[英]Haskell about recursion in list function

我正在嘗試創建一個函數(我是haskell中的新手),該函數需要兩個列表並返回一個列表。 該列表應具有第一個列表的所有元素,這些元素不在第二個列表中,所有第二個列表的元素不在第一個列表中。

因此: func [3,2,1,4] [2,5,1]應該返回[3,4,5]

我認為我的《規范》朝着正確的方向發展,但是其中的一個大錯誤是。

func :: [Int] -> [Int] -> [Int]
func [] a = a
func a [] = a
func (x:xs) (y:ys) | elem x (y:ys) = filter (/=x) (y:ys)
                   | otherwise = func ys xs

假裝對這方面的問題沒有任何經驗或對base的功能非常熟悉,我將重新編寫您的問題說明以描述我們想要的操作,並向您展示如何解決該問題:

在兩個列表上獲得fun的結果是:第一個列表中的所有元素不在第二個列表中,第二個列表中的所有元素不在第一個中。

要開始用代碼表示,請將“ is”替換為=

func l1 l2 = (elementsOfFirstNotInSecond l1 l2) ++(elementsOfFirstNotInSecond l2 l1)

現在我們需要實現elementsOfFirstNotInSecond ,所以讓我們從單詞開始:

elementsOfFirstNotInSecond兩個名單是:如果l1是空列表,則空單,否則,如果頭l1 (我們將其稱為“ x ”)是其成員l2x consed到elementsOfFirstNotInSecond 尾部l1l2 否則(如果x 不在 l2 ),則只是 l1l2尾部的elementsOfFirstNotInSecond

看看是否可以使用尚未實現的函數將其轉換為haskell(例如,您可能要使用( isAMemberOf :: Int -> [Int] -> Bool ),然后重復該過程。

輸出順序重要嗎?

如果沒有,您可以只使用Data.List列表差異(\\\\)

Prelude > import Data.List
Prelude Data.List> as = [3,2,1,4]
Prelude Data.List> bs = [2,5,1]
Prelude Data.List> notinSec = as \\ bs
Prelude Data.List> notinFst = bs \\ as
Prelude Data.List> ans = notinSec ++ notinFst 
Prelude Data.List> ans
[3,4,5]

由於您想要遞歸並且是haskell的新手,因此解決方案(朝您的方向移動)將類似於

func (x:xs) (y:ys) | elem x (y:ys) && (not (elem y (x:xs))) = func xs (filter (/=x) (y:ys))
                   | (not (elem x (y:ys))) && (elem y (x:xs)) = func (filter (/=y) (x:xs)) ys
                   | (elem x (y:ys)) && (elem y (x:xs)) = func (filter (/=y) (xs)) (filter (/=x) (ys))
                   | otherwise = x : y : (func xs ys)

但是您可以看到在學習路徑的后期,這是多么的丑陋和混亂。 我建議您使用更簡單明了的替代方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM