"Benim" matematiksel bir ifadem var OCaml.Ağaç yapısını Ocaml'de hızlı bir dize nasıl yazdırılır?
type expr =
Number of int
|Plus of expr*expr
Eh, bu çok tanımını basitleştirilmiş bir , ancak sorunu açıklamak için yeterli: Şöyle bir cebirsel türü olarak temsil edilir.
Ben Plus (Number i, Number j)
(+ i j)
olur böylece bir ters cila gösterimde bir dizeye dönüştürmek istiyorum. Bir basit uygulama
let rec convert = function
Number i -> string_of_int i
|Plus (a,b) -> (let s = convert a in let p = convert b in "(+"^s^" "^p^")")
olurdu Ama şey (büyük ağaç derinliğini var) bazı girişinde inanılmaz yavaş olmasıdır. ,
let rec make_pain so_far = function
0 -> so_far |i -> make_pain (Plus (Number 1,so_far)) (i-1)
let pain = make_pain (Number 1) 20000
let converted = convert pain
O y
uzun dizesi olduğunu dize birleştirme x^y
, görünüyor performans sorunudur: Örneğin, bu girdi benim makinede 5 saniye çalışır. Ben sadece s^p
ile "(+"^s^" "^p^")"
ifadeyi değiştirmek eğer Nitekim, bu çok daha hızlı hale gelir.
daha hızlı yapmaz yerine birleştirme printf
kullanma. C'ye dönüştürme yardımcı olabilir, ancak bir OCaml çözümü yok mu?
bir schlemiel olmayın :-) http://www.joelonsoftware.com/articles/fog0000000319.html –
@Chris evet , sorun C :) –