Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[28]

Приложение А

Ответ 2.3.1:

1. Unbound value identifier: х

2. >

3. > 3:int Ответ 2.4.1:

ML-система будет пытаться сопоставить hd: :tl: mil с "Eat" : : "the" : : "walnut" : mil. Поскольку эти списки имеют разную длину, сопоставление потерпит неудачу.

Ответ 2.4.2:

1.{ Ь=х, ... }

2. :: ::х:: или [ , , х, , ]

3.[ j (X j ) ]

Ответ 2.5.1:

local val pi=3.141592654 in fun circumference r=2.0*pi*r fun area r = pi * r * r


fun isperfect n =

let fun addfactors(1) = 1 I addfactors(m) =

if n mod m = 0 then m + addfactors(m-1) else addfactors(m-1) in (n<2) orelse (addfactors(n div 2) = n) end

Ответ 2.5.7:

fun cons h t = h::t

fun powerset [] = [[]] I powerset(h::t) =

let val pst = powerset t

in (map (cons h) pst) @ pst end;

Ответ 2.5.8:

fun cc(0, ) = 1 I cc( ,[]) = 0

I cc(amount, kinds as (h::t)) = if amount < 0 then 0

else cc(amount-h,kinds) + cc(amount.t); fun count change coins amount = cc(amount, coins);

fun abs х = if х < 0.0 then -x else x Ответ 2.5.3:

Для вычисления fact(n) потребуется вычислить выражение new if (n=0,1 ,f act (n-1)). Аргументы функции вычисляются до вычисления самой функции; поэтому потребуется вычислить fact(n-l) (даже когда n = 0!); вычисление fact(n-l) по тем же причинам потребует вычисления fact(n-2) - и т.д.; возникнет бесконечный цикл.

Ответ 2.5.5:

Эта функция неэффективным способом выполняет перестановку элементов списка в обратном порядке.

Ответ 2.5.6:


fun nth(0,1st) = 1st

I nth(n,h::t) = nth(n-l.t);

fun count change coins sum =

let fun initial table [] = [[0]]

I initial table (h::t) = [] :: (initial table t) fun count(amount.table) =

let fun count using([],1st) = 1st I count using(h::t,hl::tl) =

let val tl as ((c: : ):: ) =

count using(t,tl) val diff = amount - h val cnt = с + if diff<0 then 0

else if diff=0 then 1 else hd(nth(h-l,hl)) in (cnt::hl)::tl end

if amount > sum then hd(hd table)

else count(amount+1, count using(coins.table)) end

in count (0, initiaHable coins) end Ответ 2.5.10: local

fun move disk(from, to) = (from, to);

fun transfer(from, to, spare, 1) = [move disk(from,to)] I transfer(from, to, spare, n ) = transfer(from, spare, to, n-1) @ [move disk(from,to)] @ transfer(spare, to, from, n-1) in fun tower of hanoi(n) = transfer("A","В","C",n) end

Альтернативное решение, которое явно моделирует диски и проверяет допустимость ходов, может быть записано следующим образом:

fun incl(m,n) = if m>n then 0 else m::incl(m+l,n) fun move disk((f,fh::fl), (t,[]), spare) =

((f,fl), (t,[fh]), spare) I move disk((f,fh::f1), (t,tl as (th::tt)), spare) =

if (fh:int) > th then error "Illegal move"

else ((f,fl), (t,fh::tl), spare)



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13] [стр.14] [стр.15] [стр.16] [стр.17] [стр.18] [стр.19] [стр.20] [стр.21] [стр.22] [стр.23] [стр.24] [стр.25] [стр.26] [стр.27] [стр.28] [стр.29] [стр.30] [стр.31] [стр.32]