2017-11-03 5 views
0

私はこのタスクをuniで行いますが、私は長い間研究してきましたが、 。 リストが回文であるかどうかを確認する必要があります。ほとんどのフロア(n/2)回で再帰的に呼び出し、補助リストを割り当てないため(リストコンストラクタは使用できません) アイデアTbh、私は完全な解決策よりもアルゴリズムが好きです。OCaml関数は、リストが回り(n/2)回帰呼び出しとリスト割り付けなしのpalindromeかどうかを確認する関数です。

+1

[help/on-topic]:* 3を参照してください。宿題の助けを求める質問には、問題を解決するためにこれまでに行った作業の概要と、問題を解決するための難しさの説明が含まれていなければなりません。 – glennsl

+0

それが期待される解決策であるかどうかは不明ですが、継続でこれを確実に解決できます。 (それは基本的に明示的な短所を使用することなくリンクリストを割り当てています) – Bergi

+0

'length'を使用できますか? – Bergi

答えて

2

を、私はこれで出ているし、それが動作します:

let palindrom l = 
let rec aux l0 l1 = 
    match (l0, l1) with 
    | _,[] -> (true,[]) 
    | hd :: tl, [x] -> (hd = x, tl) 
    | _, hd1 :: tl1 -> let (pal, ll) = aux l0 tl1 in 
      match ll with 
      | [] -> (pal, []) 
      | hd::tl -> (pal && hd1 = hd, tl) in 
match l with 
[] -> true 
| _ -> fst (aux l l) 
0

二つの引数を取り、中にあなたが途中で

  • ことを再帰的ヘルパー関数を使用することができます。リストの残りの部分、および二倍遠くの開始からあるリストの残りの部分をチェックされるリスト。
  • は、チェック対象リストの途中でベースケースに達します(2番目のリストが空になるか、または奇数の場合は単一要素のみ)
  • が途中で返されます。リストのためのoption、まだ平等のために逆にチェックする必要があり、残り - 回文が

例と一致しなかった場合、またはNone

// in 
hannah hannah 
annah nnah 
    nnah  ah 
    nah  
// out 
    n <-> nah 
a <-> ah 
h <-> h 
関連する問題