获取函数结果列表,直到 result > x

Get a list of function results until result > x

我基本上想要和这个 OP 一样的东西: 但我无法获得使用 OP 的功能或我自己的功能的答案。 我将改写问题并在底部写下答案。

我正在尝试创建一个函数,它将 return 小于 2.000.000 的斐波那契数列。 (没有在函数内部写 "while" )。 这是我尝试过的:

首先,我从这个网站上选择了一种计算斐波那契数列的方法: https://code.jsoftware.com/wiki/Essays/Fibonacci_Sequence

fib =: (i. +/ .! i.@-)"0
        echo fib i.10
        0 1 1 2 3 5 8 13 21 34

然后我做了一个任意列表,我知道它比我需要的要大。 :

fiblist =: (fib i.40)       NB. THIS IS A BAD SOLUTION!

最后,我删除了大于我需要的数字:

result =: (fiblist < 2e6) # fiblist 
        echo result 
        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 1.34627e6

这得到了正确的结果,但是有没有办法避免使用一些任意数字,比如 "fib i.40" 中的 40 个?

我想编写一个函数,使 "func 2e6" return 的斐波那契数列低于 2.000.000。 (没有在函数内部写 "while")。

echo func 2e6
    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 1.34627e6

这是另一个问题的答案:

第一个回答:

 2 *^:(100&>@:])^:_"0 (1 3 5 7 9 11)
    128 192 160 112 144 176

第二个答案:

+:^:(100&>)^:(<_) ] 3 
3 6 12 24 48 96 192

据我了解,我只需要替换答案中使用的函数,但我不知道如何 那可以工作。例如,如果我尝试:

echo (, [: +/ _2&{.)^:(100&>@:])^:_ i.2

我收到一个错误。

我是这样处理的。首先,我想要一种生成第 n 个斐波那契数的方法,我使用了 f0b 从你的 link 到 Jsoftware Essays.

   f0b=: (-&2 +&$: -&1) ^: (1&<) M.

一旦我有了它,我只想将它放入一个动词中,该动词将检查 f0b 的结果是否小于一定数量(我使用了 1000),如果是,那么我递增输入并再次完成该过程。这是 ($:@:>:) 部分。 $: 是自引用。右边的0参数是生成序列的起点。

   ($:@:>: ^: (1000 > f0b)) 0
17

这告诉我第 17 个斐波那契数是小于我的极限的最大数。我使用该信息通过使用等级 0 (fob"0)

f0b 应用于 i. ($:@:>: ^: (1000 > f0b)) 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

...然后我意识到你想要一个动词来回答你原来的问题。我选择了 dyadic,其中左边的参数是极限,右边的参数生成序列。同样的想法,但是当我进入默认形式时,我能够使用一些钩子。 (> 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

我毫不怀疑其他人会提出更好的解决方案,但这是我今晚拼凑的。