OCaml

練習問題 3.11 再帰を使う

なぜかは忘れましたが、③の問題はパスしてますね〜。

練習問題 3.11.4

(* 練習課題 3-11-4 *)
(* 与えられた文字列の中で、ASCIIコードが最も大きい文字を返す max_ascii関数を定義せよ。文字列の長さを取り出す String.length という関数を使ってもよい。 *)

String.length "Hello!";;

int_of_char 'A';;

  (* ふたつのchar型の引数をとり、ASCIIコードの大きいほうを返す関数 *)
let takeBig (a, b) =
  if (int_of_char a) >= (int_of_char b)
  then a
  else b;;

  (* TEST *)
let test1 = takeBig('a', 'b') = 'b';;
let test2 = takeBig('A', 'a') = 'a';;

let moji = "Hello!";;
let i = 0;;
let (a, b) = (moji.[i], moji.[i+1]);;

let test3 = takeBig(a, b) = b;;

(* 文字列の個々の文字の大きさ(ASCII)を比べ、一番大きい文字を返す関数 *)
(* hikaku : String, int, char => char *)
let rec hikaku (moji, i, a) =
  if i = String.length moji
  then a
  else
    let a = takeBig (a, moji.[i]) in
    hikaku (moji, i+1, a)

(* TEST *)
let test11 = hikaku ("abcde", 1, 'a') = 'e';;
  
  
let max_ascii moji =
  let rec hikaku (moji, i, a) =
    if i = String.length moji                          
    then a
    else
      let a = takeBig (a, moji.[i]) in
      hikaku(moji, i+1, a)
  in
  hikaku (moji, 1, moji.[0])
                  
  (* TEST *)
let test4 = max_ascii "abcde" = 'e';;
let test5 = max_ascii "Az" = 'z';;