Форум программистов, компьютерный форум, киберфорум
F# .NET
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.69/16: Рейтинг темы: голосов - 16, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 02.11.2015
Сообщений: 6
1

Задача о восьми ферзях

13.04.2016, 19:16. Просмотров 3003. Ответов 31
Метки нет (Все метки)

Ни у кого нет кода реализации задачи о восьми ферзях?(на f# офк)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.04.2016, 19:16
Ответы с готовыми решениями:

Задача о восьми ферзях
Всем доброго времени суток! Прошу помочь разобраться что к чему и для чего в языке программы,...

Задача о восьми ферзях
Может кто-нибудь дать код решения с пояснениями: эвристическим алгоритмом (можно найти на...

Задача о восьми ферзях
Есть у меня массив из 8 случайных чисел от 0 до 7. Мне нужно найти количество атакующих друг друга...

Задача о восьми ферзях
Во время практики в колледже мне задали задание написать программу о восьми ферзях,то есть чтобы...

31
Заблокирован
13.04.2016, 19:21 2
hunakone, проблема в F# или в алгоритме?
0
0 / 0 / 0
Регистрация: 02.11.2015
Сообщений: 6
13.04.2016, 19:23  [ТС] 3
в f#
0
Заблокирован
13.04.2016, 20:39 4
hunakone, Тогда давайте алгоритм, переведу его на F#.
0
0 / 0 / 0
Регистрация: 02.11.2015
Сообщений: 6
13.04.2016, 20:42  [ТС] 5
https://ru.wikipedia.org/wiki/%D0%97...B7%D1%8F%D1%85 тут есть реализация на нескольких язык
0
Заблокирован
13.04.2016, 20:54 6
hunakone, Это не алгоритм.
Раз там столько разных версий, может попробуете перевести самостоятельно? Это действительно будет намного полезнее, чем получить сразу готовое решение.
0
0 / 0 / 0
Регистрация: 02.11.2015
Сообщений: 6
13.04.2016, 21:03  [ТС] 7
Вот алгоритм перебор с возратом
Кликните здесь для просмотра всего текста
Поставим первого ферзя в первую клетку первой вертикали. Соответственно в первый элемент нашего массива сохраним единичку. Хорошо, первый ферзь установлен. Самое время попытаться установить второго ферзя.


Он должен стоять на второй горизонтали.

Поставим его в первую клетку второй вертикали. Вызов функцию проверки, даст отрицательный результат на первом же условии, так как это строка бьется ранее установленным ферзем.
Проверим вторую клетку, второй вертикали. Результат проверки неудовлетворительный, это поле тоже бьется ранее установленным ферзем.
Теперь проверим третью клетку второй вертикали, может быть она нам подойдет? Действительно подходит. Устанавливаем туда ферзя. Переходим к установке третьего ферзя на третью вертикаль.


Проверку начинаем осуществлять с 1 клетки третей вертикали.
Думаю уже очевидно, что ни первая, ни вторая, ни третья, ни даже четвертая клетки нам не подойдут, так как они бьются ранее установленными ферзями. А вот пятая клетка, окажется в самый раз, так как её ни первый, ни второй ферзи не бьют. Значит, устанавливаем туда нашего третьего ферзя.

Аналогичным способом заполняем четвертую, пятую, шестую и седьмую вертикали. Пока что это всё можно реализовать стандартным перебором в два цикла. Внешний цикл двигается по вертикалям от 1 до 8, а внутренний по горизонталям.
Отдельно рассмотрим установку ферзя на последней вертикали.


Если вы всё делали согласно алгоритму, то на этом шаге у вас получится ситуация, изображенная на рисунке справа. Выходит, что текущего ферзя некуда установить, так как все клетки данной вертикали бьются ранее установленными семью ферзями.
Что же делать? Нужно вернуться на шаг назад и попытаться установить седьмого ферзя в другое место.
Это операция называется возврат.

Нет необходимости, снова проверять для седьмого ферзя клетки с 1 по 6, так как они уже были проверены ранее, и первые шесть ферзей остались на своих местах. Проверив седьмую и восьмую клетки, убеждаемся, что установить в них седьмого ферзя не получится, а поэтому снова делаем возврат, и теперь уже пробуем поставить на другое место шестого ферзя.
Будем проверять лишь клетки с 5 по 8. Нетрудно убедиться, что ни одна из них не подходит. А значит, выполняем еще один возврат и пытаемся установить пятого ферзя на новое место.
Проверку, как вы уже наверное догадались будем начинать с третьей клетки пятой вертикали. Она нам не подойдет, так как находится под боем, причем от двух ферзей сразу, от второго и третьего. А вот четвертая клетка свободна, и поэтому в неё и будем ставить нашего ферзя.


Продолжая в таком духе (чередуя установки с возвратами), рано или поздно мы наткнемся на такую расстановку ферзей, которая удовлетворяет всем нашим требованиям. Другими словами на доске будет размещено 8 ферзей, которые не будут бить друг друга. Наткнувшись на такую расстановку, мы сохраним её в отдельный массив, или же сразу можем вывести на экран. После чего, нам необходимо будет продолжить выполнение перебора.
0
1187 / 580 / 87
Регистрация: 20.09.2012
Сообщений: 1,864
13.04.2016, 21:12 8
Лучший ответ Сообщение было отмечено hunakone как решение

Решение

F#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
let rec permutations list taken = 
    seq { if Set.count taken = List.length list then yield [] else
          for l in list do
            if not (Set.contains l taken) then 
              for perm in permutations list (Set.add l taken)  do
                yield l::perm }
 
let succ (q : _[]) = 
    [|0..6|]     |> Array.exists (fun x ->
    [|x + 1..7|] |> Array.exists (fun y ->
        abs(q.[x] - q.[y]) = abs(x - y)
    )) |> not
 
for b in permutations [0..7] Set.empty
         |> Seq.map List.toArray
         |> Seq.filter succ do
    for e in b do
        String.replicate e ". " + "W " + String.replicate (7 - e) ". "
        |> printfn "%s"
    printfn ""
http://ideone.com/ab7jA8
3
3647 / 2377 / 314
Регистрация: 01.06.2013
Сообщений: 5,068
Записей в блоге: 9
14.04.2016, 13:43 9
Вот, попробовал сочинить на F#. Вроде, даже быстрее выполняется.
F#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
let rec gen list n = 
    if n=8 then[list] else
        let v = [0..7] |> List.filter (fun c -> 
            let rec chk lst l r = 
                let l',r'=l-1,r+1
                match lst with
                | [] -> true
                | x::t -> if x=c || x=l' || x=r' then false 
                          else chk t l' r'
            chk list c c)
        let n'=n+1
        List.map (fun i -> gen (i::list) n') v |> List.concat
 
for b in gen [] 0 do
    for e in b do
        String.replicate e ". " + "W " + String.replicate (7 - e) ". "
        |> printfn "%s"
    printfn ""
2
1187 / 580 / 87
Регистрация: 20.09.2012
Сообщений: 1,864
14.04.2016, 20:54 10
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Вроде, даже быстрее выполняется.
это не удивительно. у меня решение не сильно чтоб оптимальное.

Добавлено через 6 часов 34 минуты
поэтому приляпаю пооптимальнее
F#
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
let [<Literal>] N = 8
 
let solve() = 
    let q = Array.create N 0
    let rec succ h = function
        | -1 -> true
        | x when q.[x] = q.[h] || abs(q.[x] - q.[h]) = abs(x - h) -> false
        | x  -> succ h (x - 1)
    let acc = ref []
    let rec back x y = 
        match x , y with
        | N, N  -> ()
        | N , _ -> if succ (N - 1) (N - 2) 
                   then acc := Array.map id q :: !acc 
                   else ()
        | -1, _ -> ()
        | _ , N -> q.[x] <- 0 
        | x , y -> q.[x] <- y
                   if succ x (x - 1)
                   then back (x + 1) 0 
                        back x (y + 1) 
                   else back (x) (y + 1) 
    back 0 0
    !acc    
 
for b in solve() do
    for e in b do
        String.replicate e ". " + "W " + String.replicate ((N - 1) - e) ". "
        |> printfn "%s"
    printfn ""
самое забавное что на моей машине время выполнение solve() |> Seq.length для досок N=[8..13] практически совпадает (+5..10%) с https://ru.wikipedia.org/wiki/%D0%97...82.D0.BC.D0.B0
2
3647 / 2377 / 314
Регистрация: 01.06.2013
Сообщений: 5,068
Записей в блоге: 9
14.04.2016, 21:49 11
Да, теперь, за счёт использования мутабельных ссылок и массивов, у Вас быстрее процентов на 5.
Сравнение скорости:
Кликните здесь для просмотра всего текста
F#
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
open System
 
let [<Literal>] N = 8
 
let solve() = 
    let q = Array.create N 0
    let rec succ h = function
        | -1 -> true
        | x when q.[x] = q.[h] || abs(q.[x] - q.[h]) = abs(x - h) -> false
        | x  -> succ h (x - 1)
    let acc = ref []
    let rec back x y = 
        match x , y with
        | N, N  -> ()
        | N , _ -> if succ (N - 1) (N - 2) 
                   then acc := Array.map id q :: !acc 
                   //else ()
        | -1, _ -> ()
        | _ , N -> q.[x] <- 0 
        | x , y -> q.[x] <- y
                   if succ x (x - 1)
                   then back (x + 1) 0 
                        back x (y + 1) 
                   else back (x) (y + 1) 
    back 0 0
    !acc
 
let rec gen list n = 
    if n=8 then[list] else
        let n'=n+1
        [0..7] |> List.filter (fun c -> 
            let rec chk lst l r = 
                let l',r'=l-1,r+1
                match lst with
                | [] -> true
                | x::_ when x=c || x=l' || x=r' -> false 
                | _::t -> chk t l' r'
            chk list c c)
        |> List.map (fun i -> gen (i::list) n') |> List.concat
 
let solve1 () = gen [] 0
 
let show res =
    for b in res do
        for e in b do
            String.replicate e ". " + "W " + String.replicate (7 - e) ". "
            |> printfn "%s"
    printfn ""
 
let bench f =
    let stopWatch = System.Diagnostics.Stopwatch.StartNew()
    show (f ()) 
    stopWatch.Stop()
    stopWatch.Elapsed.TotalMilliseconds
 
let rec benchTest cnt t0 t1 =
    if cnt=100 then (t0,t1) 
    else let t0n=t0 + bench solve
         let t1n=t1 + bench solve1
         benchTest (cnt+1) t0n t1n
 
let res0,res1=benchTest 0 0.0 0.0
printfn "pycture        :  %f mS" res0
printfn "KolodeznyDiver :  %f mS" res1
Кста, строка 15 в Вашем коде, вроде бы не нужна.
1
1187 / 580 / 87
Регистрация: 20.09.2012
Сообщений: 1,864
15.04.2016, 06:23 12
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Да, теперь, за счёт использования мутабельных ссылок и массивов, у Вас быстрее процентов на 5
ну я б не стал так категоричен. билдим в релиз и пускаем не из под студии а в коммандной строке.
при выводе на экран - да 5%.
pycture : 5394.874100 mS
KolodeznyDiver : 5552.498900 mS
вывод в файл fsx.exe > zs.txt
pycture : 453.116300 mS
KolodeznyDiver : 737.747600 mS
теперь убираем тормоза которые в самому алгоритму отношения не имеют
show (f ()) меняем на Seq.length (f ()) |> ignore
pycture : 53.451800 mS
KolodeznyDiver : 304.181300 mS
http://ideone.com/AdRwzU показываед под линухом немного другой расклад но тоже не 5%
1
3647 / 2377 / 314
Регистрация: 01.06.2013
Сообщений: 5,068
Записей в блоге: 9
15.04.2016, 09:44 13

Не по теме:

Цитата Сообщение от pycture Посмотреть сообщение
ну я б не стал так категоричен.
Я не категоричен. В первом посте написал "Вроде, даже". .NET для меня "терра инкогнита". Сравнивая с Вашим первым вариантом заменил было printfn на ignore, получил
pycture : 27959.963100 mS
KolodeznyDiver : 606.326600 mS
и подумал "а не излишне ли компилятор наоптимизировал зная что нужно получить только длину" и оставил вывод. Время вывода, разумеется, влияет на результат, ну, вот, подумал, что основной расчёт занимает много больше времени.


В общем, Вы правы.
0
1187 / 580 / 87
Регистрация: 20.09.2012
Сообщений: 1,864
15.04.2016, 11:06 14
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
.NET для меня "терра инкогнита".
на самом деле во всех вариантах в этой теме нет никакой .NET специфики и все они почти без изменений должны собраться в Ocaml'e. разве что в первом используется seq, который по сути расширение в желании вставить в f# монады (хотя может и в Ocaml что появилось, сильно не слежу).

тут ситуация больше сродни быстрой сортировке: есть простой и наглядный, но очень медленный вариант, а есть быстрый, но совершенно неочевидный. поэтому первый вариант очень медленный - исключительно для сдачи зачета
0
3647 / 2377 / 314
Регистрация: 01.06.2013
Сообщений: 5,068
Записей в блоге: 9
15.04.2016, 22:08 15
Цитата Сообщение от pycture Посмотреть сообщение
в этой теме нет никакой .NET специфики
Специфика в относительных производительностях тех или иных операций.
Оказывается, что в .NET даже прямой проход по списку очень тормозной по сравнению с массивом. (Кста, на msdn чтото не вижу ничего про скорости выполнения операций. Может не там надо смотреть?)
В общем, пришаманил я массивы к своему алгоритму
Кликните здесь для просмотра всего текста
F#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
let solveArr () = 
    let rec gen (brd : int []) cs n = 
        if n=8 then [brd] else
            let nn=n+1
            cs |> List.filter (fun c -> 
                let rec chk y l r = 
                    if y=0 then true else
                        let yn=y-1                            
                        let x=brd.[yn]
                        let ln=l-1
                        if x=ln then false else
                            let rn=r+1
                            if x=rn then false else chk yn ln rn
                chk n c c)
            |> List.map (fun c -> gen (Array.concat [brd;[|c|]]) 
                                    (List.filter(fun i -> i <> c) cs) nn)
            |> List.concat
    gen Array.empty [0..7] 0
И получил
pycture : 215.943200 mS
KolodeznyDiver : 225.255600 mS // solveArr
Потом заменил массивы на целые числа, благо вся инфа по позиции там помещается, с побитовым утаптыванием.
Кликните здесь для просмотра всего текста
F#
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
33
34
35
36
37
38
let getX brd y = (brd >>> (y*3)) &&& 7
let setX brd y x = brd ||| (x <<< (y*3))
 
type ChessBoardEnumerator (v: int) = 
        let mutable i = -1
        interface IEnumerator<int> with
            member x.Current = getX v i
        interface System.Collections.IEnumerator with
            member x.Current = box (getX v i)
            member x.MoveNext() = if i=7 then false else (i <- i + 1; true)
            member x.Reset() = i <- -1
        interface System.IDisposable with
            member x.Dispose() = () 
 
type ChessBoard (v: int) =
    interface IEnumerable<int> with
        member this.GetEnumerator() = (new ChessBoardEnumerator(v) :> IEnumerator<int>)
    interface System.Collections.IEnumerable with
        member this.GetEnumerator() = (new ChessBoardEnumerator(v) :> System.Collections.IEnumerator)
 
let solveBits () = 
    let rec gen brd cs n = 
        if n=8 then [brd] else
            let nn=n+1
            cs |> List.filter (fun c -> 
                let rec chk y l r = 
                    if y=0 then true else
                        let yn=y-1                            
                        let x=getX brd yn
                        let ln=l-1
                        if x=ln then false else
                            let rn=r+1
                            if x=rn then false else chk yn ln rn
                chk n c c)
            |> List.map (fun c -> gen (setX brd n c) 
                                    (List.filter(fun i -> i <> c) cs) nn)
            |> List.concat
    gen 0 [0..7] 0 |> List.map (fun b -> new ChessBoard(b))
Получил
pycture : 216.423400 mS
KolodeznyDiver : 144.818200 mS // solveBits
Разумеется, основная сложность была в реализации IEnumerator,IEnumerable. Как оно для F# делается ни "Smith C. - Programming F# 3.0, 2nd Edition", ни "D.Syme, A.Granicz, A.Cisternino - Expert F# 3.0, 3rd Edition" не рассказывают. Можно было б для solveBits свою функцию show написать, но мы же не ищем лёгких путей. С помощью святого гугла, на примерах, получилось. Наверняка, можно изящнее.
Цитата Сообщение от pycture Посмотреть сообщение
seq, который по сути расширение в желании вставить в f# монады
мммм... при чём тут монады? Foldable,Traversable в Haskell не монады. seq - естественное желание иметь универсальный механизм работы с контейнерами.

И, кстати, зачем у Вас "Array.map id" ? Чем это лучше Array.copy ?
0
1187 / 580 / 87
Регистрация: 20.09.2012
Сообщений: 1,864
17.04.2016, 13:37 16
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
мммм... при чём тут монады
seq, async, query и пр это по факту do нотация
Как оно для F# делается ни "Smith C. - Programming F# 3.0, 2nd Edition", ни "D.Syme, A.Granicz, A.Cisternino - Expert F# 3.0, 3rd Edition" не рассказывают
ну собственно это даже хорошо. всетаки насколько я помню они больше функциональнаю часть языка рассматривают которая применима в ряде функциональный языков. а низкоуровневая оптимизация типа кастомный IEnumerable, это чистая .Нет специфика.
Чем это лучше Array.copy ?
совершенно ничем, полагаю что даже хуже. но на таком мелком кол-ве выполнения роли не играет
Оказывается, что в .NET даже прямой проход по списку очень тормозной по сравнению с массивом
Кликните здесь для просмотра всего текста
> let xs = [int64 1..int64 10000000];;
Real: 00:00:01.944, CPU: 00:00:01.953, GC gen0: 37, gen1: 25, gen2: 1

val xs : int64 list =
[1L; 2L; 3L; 4L; 5L; 6L; 7L; 8L; 9L; 10L; 11L; 12L; 13L; 14L; 15L; 16L; 17L;
18L; 19L; 20L; 21L; 22L; 23L; 24L; 25L; 26L; 27L; 28L; 29L; 30L; 31L; 32L;
33L; 34L; 35L; 36L; 37L; 38L; 39L; 40L; 41L; 42L; 43L; 44L; 45L; 46L; 47L;
48L; 49L; 50L; 51L; 52L; 53L; 54L; 55L; 56L; 57L; 58L; 59L; 60L; 61L; 62L;
63L; 64L; 65L; 66L; 67L; 68L; 69L; 70L; 71L; 72L; 73L; 74L; 75L; 76L; 77L;
78L; 79L; 80L; 81L; 82L; 83L; 84L; 85L; 86L; 87L; 88L; 89L; 90L; 91L; 92L;
93L; 94L; 95L; 96L; 97L; 98L; 99L; 100L; ...]

> let ax = [|int64 1..int64 10000000|];;
Real: 00:00:01.608, CPU: 00:00:01.515, GC gen0: 1, gen1: 1, gen2: 1

val ax : int64 [] =
[|1L; 2L; 3L; 4L; 5L; 6L; 7L; 8L; 9L; 10L; 11L; 12L; 13L; 14L; 15L; 16L; 17L;
18L; 19L; 20L; 21L; 22L; 23L; 24L; 25L; 26L; 27L; 28L; 29L; 30L; 31L; 32L;
33L; 34L; 35L; 36L; 37L; 38L; 39L; 40L; 41L; 42L; 43L; 44L; 45L; 46L; 47L;
48L; 49L; 50L; 51L; 52L; 53L; 54L; 55L; 56L; 57L; 58L; 59L; 60L; 61L; 62L;
63L; 64L; 65L; 66L; 67L; 68L; 69L; 70L; 71L; 72L; 73L; 74L; 75L; 76L; 77L;
78L; 79L; 80L; 81L; 82L; 83L; 84L; 85L; 86L; 87L; 88L; 89L; 90L; 91L; 92L;
93L; 94L; 95L; 96L; 97L; 98L; 99L; 100L; ...|]

> xs |> List.sum;;
Real: 00:00:00.140, CPU: 00:00:00.140, GC gen0: 0, gen1: 0, gen2: 0
val it : int64 = 50000005000000L
> ax |> Array.sum;;
Real: 00:00:00.066, CPU: 00:00:00.078, GC gen0: 0, gen1: 0, gen2: 0
val it : int64 = 50000005000000L
>

не знаю. вполне приличная скорость прохода. всего в 2 раза медленее. учитывая что при проходе по списку нужно постоянно с null сравнивать ничего особого в этом не вижу
0
3647 / 2377 / 314
Регистрация: 01.06.2013
Сообщений: 5,068
Записей в блоге: 9
17.04.2016, 16:22 17

Не по теме:

Цитата Сообщение от pycture Посмотреть сообщение
seq, async, query и пр это по факту do нотация
если Вы имеете ввиду в Haskell, то не вижу связи. Вы, наверное, имели ввиду "желании вставить в f# лень"?


Цитата Сообщение от pycture Посмотреть сообщение
ну собственно это даже хорошо. всетаки насколько я помню они больше функциональнаю часть языка рассматривают
Чего же хорошего. Это просто учебники по F#, а не по функциональной части F#. У Смита "CHAPTER 4. Imperative Programming", к примеру. И понять как прикрутить и дженерик и не дженерик до меня дошло не сразу. Впрочем, голову поломать в меру полезно.

Добавлено через 18 минут
Цитата Сообщение от pycture Посмотреть сообщение
учитывая что при проходе по списку нужно постоянно с null сравнивать
А при доступе к элементу массива по индексу выход индекса за границы тоже проверяется. В моём варианте именно так - рекурсия с увеличением индекса, но с массивом работает много быстрее. Кста, попытка заменить в solveArr List.filter , List.map на [for in do ..... yield gen ...] тоже дало тормоза, хотя казалось, будет наоборот. Кругом специфика .NET и F#.
0
1187 / 580 / 87
Регистрация: 20.09.2012
Сообщений: 1,864
17.04.2016, 21:08 18

Не по теме:

Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
если Вы имеете ввиду в Haskell, то не вижу связи. Вы, наверное, имели ввиду "желании вставить в f# лень"?
лень это просто lazy. а computation expression это do нотация для просторения всякого, в том числе и монад. вот чтото типа update http://tomasp.net/blog/2014/update-monads/



Добавлено через 3 часа 58 минут
for in do ..... yield gen ...
это тоже или стейтмашина или computation expression и оно может работать медленее (на самомо деле % на 20 что в большинстве случаев роли не играет). но это больше специфика компилятора как он строит код, к .нету как таковому отношения не имеет. там в компиляторе мно чего можно было б подпилить, но народ особо в сторону оптимизации кода не парится. типа если можно без сильных бубнов сделать скорость как на с# то типа все в порядке.

Добавлено через 4 минуты
У Смита "CHAPTER 4. Imperative Programming", к примеру.
это у него чтоб c#перов не напугать до конца. типа вот вам знакомые методы программирования. а если полистать F# for Scientists то там вообще сплошная функциональщина если память не изменяет
1
3647 / 2377 / 314
Регистрация: 01.06.2013
Сообщений: 5,068
Записей в блоге: 9
17.04.2016, 23:48 19
Цитата Сообщение от pycture Посмотреть сообщение
чтоб c#перов не напугать до конца
Меня "напугало" что мутабельные переменные нельзя использовать в генераторах списков (массивов, ...), хотя ссылки можно.
Цитата Сообщение от pycture Посмотреть сообщение
если полистать F# for Scientists
Не листал. Листал, но пока не читал "Tomas Petricek and Phillip Trelford - F# Deep Dives - 2014".
0
Заблокирован
18.04.2016, 00:58 20
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Меня "напугало" что мутабельные переменные нельзя использовать в генераторах списков (массивов, ...), хотя ссылки можно.
KolodeznyDiver, в F#4.0 тоже нельзя?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.04.2016, 00:58

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Пример о восьми ферзях
вот накропал но проверить возможности сейчас нет да и интересно посмотреть предложения и ваши...

Ошибка в задаче о восьми ферзях
Суть задачи заключается в том, что нужно суметь расставить на шахматной доске (8 х 8) восемь ферзей...

Исправить программу для решения задачи о восьми ферзях,не правильно отображается на схеме
unit Unit1; {$mode objfpc}{$H+} interface uses Classes,Unit2,Unit3, SysUtils, FileUtil,...

В рекурсивной программе о восьми ферзях подсчитать, сколько было сделано возвратов назад
Помогите, пожалуйста, написать код к задаче Условие задачи: В программе о восьми ферзях...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.