Это не домашнее задание. Я изучаю Standard ML самостоятельно. Я тоже немного знаю Scheme, поэтому на этот вопрос можно ответить на любом языке.
Мое добровольное задание — написать функцию, которая создает список целых чисел от 1 до n. Например, list(7) должен возвращать [1,2,3,4,5,6,7]. Решение O(n) было бы идеальным.
Легко построить список в обратном порядке (т.е. [n,n-1,..,1]) за линейное время:
fun list 1 = 1::nil
| list n = n::list(n-1);
Моя попытка построить список в будущем составляет O (n ^ 2), потому что операция добавления является линейной.
fun list 1 = 1::nil
| list n = list(n-1) @ n::nil;
Моя следующая попытка состояла в том, чтобы построить список от конца к началу (справа налево), начав с nil, присоединив n к началу и рекурсивно возвращаясь к 1. Но это совсем не сработало.
fun list n = (if n = 1
then 1
else list(n-1) :: n) :: nil;
Что-то заставляет меня думать, что мне нужна вспомогательная функция, которая создает незавершенные списки для использования в рекурсии, но я в тупике.