gpt4 book ai didi

recursion - 在J中创建递归默认函数

转载 作者:行者123 更新时间:2023-12-03 06:53:08 25 4
gpt4 key购买 nike

我是 J 的新手,我一直在尝试创建斐波那契函数作为练习(始终是我学习语言时创建的第二个函数)。我只是不明白我的做法到底出了什么问题。我尝试将其定义为默认,但如果参数大于 1,它就会挂起。

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

我还尝试显式创建它,效果很好。

fib =: 3 : 'if. y>1 do. (fib (y-1)) + (fib (y-2)) else. y end.'

我尝试通过将 3 替换为 13 来创建默认值,但它引发了错误。

   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.'

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

最佳答案

这是我认为更清晰、更简洁的替代方案:

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

与更规范的(伪代码)定义进行比较:

fib(n) = fib(n-1) + fib(n-2) if n > 2 else n

首先,不要使用 [ `@. (>&1) ,使用动名词,最好使用 ^:(1&<) 。对于 f(n) if cond(n) else n ,使用^:连词更为惯用; ^:0意思是“什么都不做”和 ^:1意思是“做一次”,所以意图很明确。 @.更适合非平凡的行为。

其次,使用& bond/compose 连词显着简化了火车。重复使用[:]相当困惑和不透明。使用 & 进行重构整理相关操作:首先,分割n分成两部分,即n-2n-1 ,然后,将 fibn 加在一起这两个数字。

最后,"0用于列表处理和 M.用于内存。 M.从性能角度来看相当重要,因为规范定义的直接实现将调用 fib(2)过度。通过内置的内存副词,您可以拥有蛋糕(一个简单的定义)并吃掉它(良好的性能)。

此特定定义的来源:f0bthis page .

关于recursion - 在J中创建递归默认函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24170253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com