-1

これが私の質問です。たとえば、c1 は c2 を所有し、c3 を所有し、c4 を所有していますが、 c1(など)によるc4の「間接的な」所有権は直接述べられていません。国を指定する 2 つの文字列が指定された場合、最初のものが 2 番目のものを所有しているかどうかを示すブール値を返す関数 'owns' を作成する必要があります (上記の c1 と c4 の場合のように、間接的であっても)。ここに私のコードがあります。私はそれが正しくないことを知っています。

lst = [("uk","scotland"),("scotland","aberdeen"),("china","hongkong"),("hongkong","kulong")]
owns :: String-> String -> Bool
owns a b 
    | n = lookup a (fromList lst)
        |if b==n 
            return true
        |otherwise m = lookup n (fromlist lst)
            if b==m
            return true
    | otherwise = False

出力結果が次のようになることを期待しています。

Main> owns "uk" "scotland"
True
Main> owns "uk" "aberdeen"
True
Main> owns "uk" "hongkong"
False
4

1 に答える 1

1
owns parent child = parent == child || any (owns parent) [p | (p, c) <- lst, c == child]

これがどのように機能するかを知りたいと思うでしょう。

まず、これが再帰問題であることを認識します。c1 が c2 を所有 c3 が c4 を所有 など。したがって、基本ケースと再帰ケースが必要です。

ベースケースはparent == child. これが真であれば、全体的な答えは真です。

さて、再帰的なケース。any関数とリストを受け取り、リストのいずれかのメンバーによって関数が True を返す場合、True を返します。

(私は今寝る必要があります。必要に応じて後でこれに戻ります。)

于 2011-04-13T22:47:02.413 に答える