2011-12-20 3 views
1

Я пытаюсь написать программу для вычисления треугольников. Может ли кто-нибудь дать мне короткий код в F # sharp для этого расчета?Использование F # для вычисления треугольника

enter image description here

Это то, что я до сих пор, но я не уверен, что это лучший способ:

let area a b c = 
    let s = sqrt((a + b + c)/2) 
    sqrt(s * (s - a) * (s - b) * (s - c)) 
+0

Домашнее задание, возможно? – DOK

+0

Нет, не домашнее задание. Пытаюсь, но я не уверен, что это лучшее решение. – Kai

+0

'code'let area abc = let s = sqrt ((a + b + c)/2) sqrt (s * (s - a) * (s - b) * (s - c)); ' – Kai

ответ

5

Кажется, вы пытаетесь применить различные формулы в зависимости от типа треугольника у вас есть. Если у вас есть три стороны, вы используете Heron's formula, если у вас есть одна сторона, вы предполагаете, что треугольник равносторонний, если у вас есть две стороны, вы предполагаете, что треугольник прав, а обе стороны - это катхети. Если бы я правильно интерпретировал, я бы определил дискриминационный союз, например:

type Triangle = 
| Generic of float * float * float 
| Equilateral of float 
| Right of float * float 

let area (t : Triangle) : float = 
    match t with 
    | Generic (a, b, c) -> let s = (a + b + c)/2. 
         sqrt(s*(s-a)*(s-b)*(s-c)) 
    | Equilateral a  -> sqrt(3.) * (a ** 2.)/4. 
    | Right (a, b)  -> (a * b)/2. 

// testing 
let triangles = [Generic (2., 3., 4.); Equilateral 2.; Right (2., 3.)] 

triangles |> 
List.iter (fun t -> Console.WriteLine(area t)) 
+0

вау ... большое спасибо за это решение Паоло. – Kai

3

Только перевод этих формул? Должно быть что-то вроде этого:

let area a = (a ** 2./4.) * sqrt 3. 

let area' a b = a * b/2. 

let area'' a b c = 
    let s = (a + b + c)/2. 
    sqrt(s * (s - a) * (s - b) * (s - c)) 
+0

Большое спасибо Густаво. Это почти подходит моему решению. – Kai

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