Я подошел к этому так.Сначала я хочу получить способ генерирования n-го числа Фибоначчи, и я использовал f0b
из вашей ссылки на эссе Jsoftware.
f0b=: (-&2 +&$: -&1) ^: (1&<) M.
После того, как я это сделал, я просто хочу поместить его в глаголэто проверит, чтобы увидеть, является ли результат f0b
меньше определенной величины (я использовал 1000), и если это было так, я увеличил ввод и повторил процесс снова.Это часть ($:@:>:)
.$:
- это самообращение.Правильный аргумент 0
является отправной точкой для генерации последовательности.
($:@:>: ^: (1000 > f0b)) 0
17
Это говорит о том, что 17-е число Фибоначчи является наибольшим, меньше моего предела.Я использую эту информацию, чтобы сгенерировать числа Фибоначчи, применяя f0b
к каждому элементу в i. ($:@:>: ^: (1000 > f0b)) 0
, используя ранг 0 (fob"0
)
f0b"0 i. ($:@:>: ^: (1000 > f0b)) 0
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
В вашем случае вы хотели получить числа под 2000000
f0b"0 i. ($:@:>: ^: (2000000 > f0b)) 0
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269
... и тогда я понял, что вы хотели, чтобы глагол мог ответить на ваш первоначальный вопрос.Я пошел с диадическим, где левый аргумент является пределом, а правый аргумент генерирует последовательность.Та же идея, но я смог использовать некоторые крючки, когда я перешел на молчаливую форму.(> f0b)
проверяет, находится ли результат f0b ниже предела, и ($: >:)
увеличивает правый аргумент, оставляя левый аргумент для $:
2000000 (($: >:) ^: (> f0b)) 0
32
fnum=: (($: >:) ^: (> f0b))
2000000 fnum 0
32
f0b"0 i. 2000000 fnum 0
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269
У меня мало сомнений, что появятся другиес лучшими решениями, но это то, что я собрал сегодня вечером.