Recursion 在J中创建递归默认函数

Recursion 在J中创建递归默认函数,recursion,j,tacit-programming,Recursion,J,Tacit Programming,我是J的新手,我一直在尝试创建一个斐波那契函数作为练习(总是学习语言时创建的第二个函数)。我就是搞不清楚我这样做到底出了什么问题。我试着把它定义为默契,但若争论大于一,它就会被挂起 fib =: [ ` (($: (]-1)) + ($: (]-2))) @. (>&1) 我还尝试显式地创建它,效果很好 fib =: 3 : 'if. y>1 do. (fib (y-1)) + (fib (y-2)) else. y end.' 我试图用13代替3来创造一个默契,但它抛出

我是J的新手,我一直在尝试创建一个斐波那契函数作为练习(总是学习语言时创建的第二个函数)。我就是搞不清楚我这样做到底出了什么问题。我试着把它定义为默契,但若争论大于一,它就会被挂起

fib =: [ ` (($: (]-1)) + ($: (]-2))) @. (>&1)
我还尝试显式地创建它,效果很好

fib =: 3 : 'if. y>1 do. (fib (y-1)) + (fib (y-2)) else. y end.'
我试图用13代替3来创造一个默契,但它抛出了一个错误

   fib =: 13 : 'if. y>1 do. (fib (y-1)) + (fib (y-2)) else. y end.'
|spelling error
|   if. y>1 do. (fib (y-1)) + (fib (y-2)) else. y end.
|   ^
|   fib=:    13 :'if. y>1 do. (fib (y-1)) + (fib (y-2)) else. y end.'

所以,我要求有人解释我到底做错了什么。

好的,我找到了。我只通过默认生成器运行递归块,得到了这个块

   13 : '(f y-1) + (f y-2)'
([: f 1 -~ ]) + [: f 2 -~ ]
然后我把它插入到原来的作品中,得到了这个

fib =: [ ` (([: $: 1 -~ ]) + [: $: 2 -~ ]) @. (>&1)

这就像一个符咒。我还在末尾插入了
“0
,以使其接受列表。

这里有一个我认为更清晰、更简洁的替代方案:

fibn =: (-&2 +&$: -&1)^:(1&<) M."0

首先,与其将
[`
@(>&1)
一起使用动名词,不如使用
^:(1&这几乎就是我现在要做的。我的答案显示了我是如何找到我的解决方案的,我知道这是错误的。谢谢你花时间来写这篇文章。没问题。我看到了时间戳,所以我猜你可能会有显著的进步,个人也不需要这个建议,但我认为最好把它留给任何新的读者好的,我会把这个作为公认的答案,因为它确实有一些好的信息。
fib(n) = fib(n-1) + fib(n-2) if n > 2 else n