haskell 基礎題解(50)

2021-09-26 14:33:57 字數 1807 閱讀 4894

【題目】給定兩個點p1,p2,可以唯一地確定一條直線。另給定一點 p0,求p0到直線的距離。

已知的是3個點。求的結果是乙個浮點數。

當 p1= p2 的時候,直線不存在,故無解。其它情況都是有解的。

解法一:

考慮三角形 p0p1p2 的面積為 s, p1 p2 距離為 d,就可求來 高 h,即為解。

三角形面積可用:海倫定理,或三階生列式。

type

point=(

double

,double

)type line =

(point

,point

)pttoline :: point

-> line -

> maybe double

pttoline (x0,y0)

((x1,y1)

,(x2,y2)

)| dis ==0

= nothing

| otherwise = just (area *

2/ dis)

where

dis = sqrt $ (x2-x1)^2

+(y2-y1)^2

area = abs(x0*y1 + x1*y2 + x2*y0 - x2*y1 - x1*y0 - x0*y2)

*0.5

main :: io (

)main =

doprint $ pttoline (0,

0)((

0,5)

,(15/

4,0)

)print $ pttoline (4,

4)((

5,0)

,(5,8))

解法二:

如上圖。做向量 v1 = p1->p0, v2 = p1->p2

如果能把這兩個向量同時旋轉,使得 v2 與 x 軸重合。此時的 v1 的虛部即為所求。

旋轉就是複數的乘法,為了保持模不變,乘的應該是個單位複數。它的方向是v2的共軛複數。

import

data

.complex

type

point=(

double

,double

)type line =

(point

,point

)pttoline :: point

-> line -

> maybe double

pttoline (x0,y0)

((x1,y1)

,(x2,y2)

)| v2 ==0

= nothing

| otherwise = just . abs . imagpart $ v1'

where

v1 = (x0-x1) :+ (y0-y1)

v2 = (x2-x1) :+ (y2-y1)

v2u = conjugate $ v2 / (magnitude v2 :+ 0)

v1'= v1 * v2u

main :: io (

)main =

doprint $ pttoline (0,

0)((

0,5)

,(15/

4,0)

)print $ pttoline (4,

4)((

5,0)

,(5,8))

haskell 基礎題解(06)

題目 如果乙個數的所有真因子 不包含它自身的因子 之和恰等於其自身,則該數為完全數,也稱為完美數 perfect number 完全數有許多奇妙的性質。但它們很稀少,你來求前幾個吧。最小的乙個是 6,因為 6 1 2 3 這個完全數的定義已經很清楚了,如果沒有什麼妙法,就地毯式搜尋也可以。下法就是 ...

haskell 基礎題解(07)

題目 11 1 1 2 1 1 3 3 1 1 4 6 4 1 這個陣勢叫楊輝三角,國外叫帕斯卡三角。前一行的數字中,每兩個相鄰的數字相加就得到下一行的數字。左右兩邊的數永遠是 1 寫個程式,輸出前幾行的楊輝三角。import data.list intersperse yang hui int y...

haskell基礎題解(14)

題目 用自然數蛇形填充乙個 n 階的方陣。當n 5時,形如 這個問題用 haskell 解決時與 題目13 差別甚微。實際上,從函式式的思考習慣看,只要讓有些行作成後反轉一下就可以了。上 ju n f x x 0.n 1 where f row even row take n row n 1.odd...