Создание списоков списков
От: _NN_ www.nemerleweb.com
Дата: 17.11.13 16:29
Оценка:
Подскажите как сделать оптимальнее и возможно правильнее.
Имеем список ,скажем , строк и функцию принимающую строку и возвращающую список строк.
На каждый элемент списка получаем список из функции и нужно его обойти и передать хвост дальше.

Скажем при данных "a", "b" и функции x => [x + "x", y + "y"] получаем все возможные варианты: [ax, bx], [ax, by], [ay, bx], [ay, by]

Вот код который этот делает. (Прощу прощения за Nemerle )
Конкретно мне не нравится acc + [h'] , этот имеет линейную сложность.

using Nemerle.Collections;
using System.Console;

module Program
{
  F(l : list[string], f : string -> list[string]) : list[list[string]]
  {
    def impl(l, acc)
    {
      match(l)
      {
      | [] => [acc]
      | h :: t => f(h).Map(h' => impl(t, acc + [h'])).Flatten()
      }
    }
    
    impl(l, [])
  }
 
  Main() : void
  {
    def res = F(["a", "b"], x => [x + "x", x + "y"]);
    
    // ax, bx
    // ax, by
    // ay, bx
    // ay, by
    foreach(r in res)
      WriteLine($"..$r");
    
    _ = ReadLine();
  }
}


Map = Haskell map
Flatten = Haskell concat
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.