2016-09-22 87 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
    • if n > 0然後我打電話給一個新功能check就行了,tl的休息,總是這樣:
      • 如果tl爲空,那麼真正的
      • 其他tl開始與n'那麼如果n' = n * n然後我遞歸調用check上休息,我需要保持那我現在檢查n * n * n的事實...
    • 如果n <= 0然後false

在OCaml中,這將是

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功能,我讓你把它寫;-)當然,這可能是不好的,因爲你可以有一個溢出,也許你會喜歡看看n'^(1/p) = nn'的pth根(爲什麼我們沒有在stackoverflow上有LaTeX數學模型? :-())

相關問題