2016-09-22 5 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

Почему вы пишете «новое рубину» и помечаете вопрос ocaml (я не знаю рубина, он выглядит как OCaml-Code)? Вы имели в виду несколько вместо власти? потому что в вашем примере 8 не является силой 4! Или вы имели в виду силу первого элемента? –

ответ

2

Ну, в первую очередь необходимо формализовать проблему:

  • если мой список пуст, то true
  • если мой список не является, то она начинается с номера n
    • если n = 1, тогда мне нужно снова начать, потому что a^0 = 1 for all a
    • если 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) = n (корень pth из n' (почему бы нам не использовать Mathmode LaTeX в stackoverflow? :-())

Смежные вопросы