Форум программистов, компьютерный форум, киберфорум
F# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
10 / 10 / 2
Регистрация: 23.09.2012
Сообщений: 427

Описать функцию, которая создаёт новый список из каждого второго элемента исходного списка

21.11.2013, 16:43. Показов 2392. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Описать функцию, которая создаёт новый список из каждого второго элемента исходного списка
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.11.2013, 16:43
Ответы с готовыми решениями:

Определите функцию (f s), которая из списка чисел s создает новый список, меняя знак у каждого атома. Исходный список не предполагается одноуровневым
Определите функцию (f s), которая из списка чисел s создает новый список, меняя знак у каждого атома. Исходный список не предполагается...

Описать функцию, которая строит список из положительных элементов исходного списка
1. Дан список L, элементами которого являются вещественные числа. Описать функцию, которая по списку L строит два новых списка: L1 - из...

Clojure Определите функцию (f s n), которая из списка чисел s создает новый список, прибавляя к каждому атому число n
Определите функцию (f s n), которая из списка чисел s создает новый список, прибавляя к каждому атому число n. Исходный список не...

9
Заблокирован
29.03.2015, 10:04
F#
1
2
3
4
5
6
7
8
//Описать функцию, которая создаёт новый список из каждого второго элемента исходного списка
let second list = 
    List.zip list [0..list.Length-1] |> List.filter(fun x ->(snd x)%2=0)
    |> List.map fst
 
let sp = [0..10]
sp |> printfn "%A" 
second sp |> printfn "%A"
Code
1
2
[0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10]
[0; 2; 4; 6; 8; 10]

Не по теме:

Не хватает второй перегрузки метода "where" из C#-LINQ

0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
29.03.2015, 11:53
Лучший ответ Сообщение было отмечено Ev_Hyper как решение

Решение

Цитата Сообщение от Ev_Hyper Посмотреть сообщение
Не хватает второй перегрузки метода "where" из C#-LINQ
э-э-э.. где не хватает?
F#
1
2
3
open System.Linq
let sec4 (xs : 'a list) = 
    xs.Where(fun _ i -> i % 2 = 0) |> Seq.toList
Добавлено через 2 минуты
Кликните здесь для просмотра всего текста

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
// кратко
let rec sec1 xs = 
    match xs with a::_::t | a::([] as t) -> a :: sec1 t | _ -> []
 
// быстро
let sec2 xs = 
    let rec loop acc = function 
                       | a::_::t | a::([] as t) -> loop (a::acc) t
                       | _ -> List.rev acc
    loop [] xs
 
// 
let sec3 xs = 
    xs |> List.mapi (fun i e -> if i % 2 = 0 then Some e else None) 
       |> List.choose id
 
open System.Linq
let sec4 (xs : 'a list) = 
    xs.Where(fun _ i -> i % 2 = 0) |> Seq.toList
 
let sec5 (xs : 'a list) = 
    let xs' = ref xs
    [for i in 1..List.length xs do
        let h::t = !xs'
        if i % 2 = 1 then yield h else ()
        xs' := t]
 
let sec6 (xs : 'a list) = 
    seq { 
        let xs' = ref <| List.toSeq xs
        while Seq.isEmpty !xs' |> not do 
                yield Seq.head !xs'
                xs' := Seq.skip 1 !xs' 
                if Seq.isEmpty !xs' |> not then xs' := Seq.skip 1 !xs' 
                }
    |> Seq.toList

http://ideone.com/atPGK0
2
Заблокирован
29.03.2015, 11:59
Цитата Сообщение от pycture Посмотреть сообщение
э-э-э.. где не хватает?
pycture, такой способ я знаю. Linq в F# выглядит немного избыточным - все таки часть методов доступны и так.

Добавлено через 2 минуты

Не по теме:

Цитата Сообщение от pycture Посмотреть сообщение
http://ideone.com/atPGK0
pycture, а почему большая часть только на ideone, а тут на форуме не показываете?)

0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
29.03.2015, 12:08

Не по теме:

Цитата Сообщение от Ev_Hyper Посмотреть сообщение
а почему большая часть только на ideone, а тут на форуме не показываете?
это такой спойлер. что б изучающие совсем не разленились :)



Добавлено через 1 минуту
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
Linq в F# выглядит немного избыточным - все таки часть методов доступны и так.
я б не сказал что часть методов Linq доступны. всякие List.filter и пр это всетаки не Linq.
0
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
11.04.2015, 09:51
Каждое применение zip, filter или map, подразумевает полный обход всех элементов списка. Три обхода для такой задачи как-то многовато.
Вот простой вариант в два обхода (fold и rev)
F#
1
2
3
4
5
6
let filterEven l = 
    List.fold (fun (result, index) el -> 
                if index % 2 = 0 
                then (el::result, index + 1) 
                else (result, index + 1)) ([], 0) l 
                |> fst |> List.rev
Ну и в один обход как-то так можно сделать
F#
1
2
3
4
5
6
let filterEven l = 
    List.foldBack (fun el (result1, result2, index)  -> 
        if index % 2 = 0 
        then (el::result1, result2,  index + 1) 
        else (result1, el::result2, index + 1 )) l ([],[],0) 
        |||> fun r1 r2 i -> if i % 2 = 0 then r2 else r1
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
11.04.2015, 12:37
Цитата Сообщение от diadiavova Посмотреть сообщение
простой вариант в два обхода
пораждает кучу туплов - негативно скажется на скорости и памяти
один обход как-то так можно сделать
маловероятно что foldBack имеет какоето преймущество перед 2-мя проходами
0
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
11.04.2015, 13:08
Цитата Сообщение от pycture Посмотреть сообщение
пораждает кучу туплов - негативно скажется на скорости и памяти
Вот тут, честно говоря, просто не в курсе.
Цитата Сообщение от pycture Посмотреть сообщение
маловероятно что foldBack имеет какоето преймущество перед 2-мя проходами
А как же катаморфизм?

Добавлено через 16 минут
И, кстати, насчет кортежей: зиповка ведь тоже их создает и тоже по одному на каждый элемент списка. Да и генерация [0..list.Length-1] - штука тоже не бесплатная: и сам список сгенерировать надо, да еще тут и подсчет элементов производится, который тоже подразумевает обход списка.
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
11.04.2015, 13:39
Цитата Сообщение от diadiavova Посмотреть сообщение
катаморфизм
а он утут причем?
зиповка ведь тоже их создает и тоже по одному на каждый элемент списк
создает. вариант без создания (sec2) спрятан выше

Добавлено через 10 минут
маловероятно что foldBack имеет какоето преймущество перед 2-мя проходами
https://github.com/fsharp/fsha... re/list.fs
line 192
0
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 43
11.04.2015, 14:13
Цитата Сообщение от pycture Посмотреть сообщение
вариант без создания (sec2) спрятан выше
Да, круто. Не заметил, поскольку там речь шла о линк-функциях, вчитываться не стал.
Цитата Сообщение от pycture Посмотреть сообщение
line 192
Мда...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.04.2015, 14:13
Помогаю со студенческими работами здесь

программа которая берет список и создает список другой из этого же списка + тот же список без последнего элемента
надо написать программу которая берет список и создает список другой из этого же списка + тот же список без последнего элемента к...

Динамические структуры данных. Сформировать динамический список, описать функцию, которая удаляет из списка за каждым вхождением элемента Е
Сформировать динамический список (стек или очередь), считая, что длина списка (количество элементов) задана. Описать функцию, которая...

Описать функцию FillArray(out int[] arr), которая создает и заполняет новый массив
1.Описать функцию FillArray(out int arr), которая создает и заполняет новый массив целочисленных элементов случайным количеством...

Описать и проверить процедуру или функцию, которая вставляет в список L за первым вхождением элемента Е все элементы списка L1, если Е входит в L1.
type TЭ=…; {тип элементов списка} {выбирается по желанию} список= ^звено; звено: record элем: TЭ; ...

Описать функцию, которая определяет, входят ли все элементы первого списка в состав второго списка.
Описать функцию, которая определяет, входят ли все элементы первого списка в состав второго списка. на с++


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru