2016-09-22 4 views
1

私はルビーに新しいことがありますが、問題に取り組んでいますが、それを理解する方法はわかりません。 各要素が前の要素の累乗である場合にtrueを返す関数を作成したい場合は、それ以外の場合はfalseを返します。リストに連続した力があるかどうかをチェックする方法

例:リスト[2; 4; 8; 16] true 関数はfalseを返します。[3; 7; 9;]

let consec_ele element = match element with 
[] -> true 
h::t -> 
if h > t then false 
else 
    if t/h = 0 && t mod h = 0 then true 
;; 

私はちょうどそれを動作させる方法を見つけ出すので、再帰的にそのことはできません。

+1

なぜ "new to ruby​​"と書かれているのですか?ocamlで質問にタグを付けるのはなぜですか(RubyはOCaml-Codeのようです)? パワーの代わりに複数の意味ですか?あなたの例では、8は4の威力ではないからです!あるいは、最初の要素の力を意味しましたか? –

答えて

2

さて、あなたは最初にあなたの問題を形式化する必要があります。

  • 私のリストは、その後、true
  • 空であれば私のリストがない場合、それは数n
    • 場合で始まりますn = 1を入力してから、もう一度やり直す必要があります。a^0 = 1 for all a
    • n > 0の場合は、新しい関数リストの残りの、tl、このような演技:
      • その後、n'tlが空の場合、真
      • tl開始n' = n * nはその後、私は残りの部分に再帰的にcheckを呼び出して、私は維持する必要がある場合私は今n * n * nをチェックしていたという事実...
    • n <= 0場合、false
  • これは

    let consec_ele l = 
        let rec cer b = function 
        | [] -> true 
        | n :: tl -> 
         if n <= 0 then false 
         (* We can start again for the first 1 we see, but if our 
         * list is [1; 1; 1; ...; 1] then we need to stop 
         * That's why we have this boolean b which is true and once 
         * we see 1 as the head of our list we swap it to false 
         *) 
         else if n = 1 then b && cer false tl 
         else 
         let rec check p = function 
          | [] -> true 
          | n' :: tl -> n' = pow n p && check (p + 1) tl 
         in check 1 tl 
        in cer true l;; 
    

    あなたがオーバーフローを持っている可能性があるため、(pow機能については、私はあなたがもちろん;-)それを書いてみましょう、これは多分あなたが好む、悪いことすることができますでしょうOCamlでは

n'^(1/p) = n(pルートのn'(私たちはstackoverflowにLaTeX mathmodeを持っていませんか? :-())

関連する問題