K шаблон для протокола итератора
Я играю с K-реализацией Джона Эрнеста в контексте задач Project Euler.
Многие из проблем включают в себя получение первых n слагаемых или всех слагаемых <= n из бесконечного ряда (особенно простых). Это может также включать выбор элементов из ранее существующего списка по одному, пока не будет выполнено условие.
В Python один из подходов заключается в том, чтобы полагаться на протокол итератора: вы можете взять итератор, пока он не закончится, или прервать работу рано, когда какое-то условие выполнено (например, вы взяли n элементов, или последний элемент, который вы приняли, удовлетворяет определенному условию). состояние).
Каковы типичные шаблоны в K (или других APL) для достижения чего-то подобного, то есть, взятие из списка или генератора до тех пор, пока условие не будет выполнено, без оценки или обработки всего списка? Должен ли я полагаться на методы ниже, возможно, используя какое-то внутреннее состояние внутри f
? Не рекомендуется ли такой подход, и если да, то почему?
f/x / fixed point
n f/x / apply f n times
p f/x / do or while loop, with p a predicate function (stops when 0)
РЕДАКТИРОВАТЬ 2018-10-14: некоторые интересные заметки о ленивой итерации в APL здесь.
0 ответов
Как вы упомянули (и как было предложено в комментарии):
p f/x / do or while loop, with p a predicate function (stops when 0)
Действительно, вы можете предоставить функцию предиката, которая будет применяться к результату на каждом этапе. Итерация продолжается, пока результат предиката равен 1b, и останавливается в противном случае. Вот как, например, остановить вычисление последовательности Фибоначчи, когда она превышает 100:
{*|x<100} {x,+/-2#x}/1 1