Я должен был написать набор функций для задач класса. Я думаю, что то, как я их написал, было немного сложнее, чем нужно. Мне пришлось реализовать все функции самостоятельно, без использования и предопределенных. Я хотел бы узнать, есть ли какие-либо быстрые простые «однострочные» версии этих ответов?Простые функции для SML/NJ
- Наборы могут быть представлены в виде списков. Элементы набора могут отображаться в любом порядке в списке, но не должно быть больше одного . Вхождение элемента в список.
(a) Определите dif (A, B), чтобы вычислить разницу в наборах A и B, A-B.
(b) Определить декартову (A, B) для вычисления декартова произведения множества A и множества B, {(a, b) | a∈A, b∈B}.
c) Рассмотрим математическую индукционную проверку для следующего содержания: Если множество A имеет n элементов, то набор параметров A имеет 2n элементов. Следуя доказательству, определите poweret (A) для вычисления набора набора A, {B | B ⊆ A}.
(d) Определите функцию, которая задает набор A и натуральное число k, возвращает набор всех подмножеств A размера k.
(* Takes in an element and a list and compares to see if element is in list*)
fun helperMem(x,[]) = false
| helperMem(x,n::y) =
if x=n then true
else helperMem(x,y);
(* Takes in two lists and gives back a single list containing unique elements of each*)
fun helperUnion([],y) = y
| helperUnion(a::x,y) =
if helperMem(a,y) then helperUnion(x,y)
else a::helperUnion(x,y);
(* Takes in an element and a list. Attaches new element to list or list of lists*)
fun helperAttach(a,[]) = []
helperAttach(a,b::y) = helperUnion([a],b)::helperAttach(a,y);
(* Problem 1-a *)
fun myDifference([],y) = []
| myDifference(a::x,y) =
if helper(a,y) then myDifference(x,y)
else a::myDifference(x,y);
(* Problem 1-b *)
fun myCartesian(xs, ys) =
let fun first(x,[]) = []
| first(x, y::ys) = (x,y)::first(x,ys)
fun second([], ys) = []
| second(x::xs, ys) = first(x, ys) @ second(xs,ys)
in second(xs,ys)
end;
(* Problem 1-c *)
fun power([]) = [[]]
| power(a::y) = union(power(y),insert(a,power(y)));
Я никогда не получил проблемы 1-й, так как они мне потребовалось некоторое время, чтобы получить. Любые предложения по сокращению этих сокращений? Была еще одна проблема, которую я не получил, но я хотел бы знать, как ее решить для будущих тестов.
- (проблема лестницы) Вы хотите пойти вверх по лестнице п (> 0) шагов. В свое время вы можете пройти один шаг, два шага или три шага. Но, например, , если есть один шаг влево, вы можете пойти только на один шаг , а не на два или три шага. Сколько разных способов для подниматься по лестнице? Решите эту проблему с помощью sml. (a) Рекурсивно решает его . (b) Решите его итеративно.
Любая помощь по решению этой проблемы?