我目前正在尝试在J中编写此函数: (T(1)= 1)
我的代码是:
ints=: }.&i. NB. list from 1 to n-1
chs =: ints !/ [ NB. list of binomials
subi=: - ints NB. list from n-1 to 1
T=: +/(($: @: subi) * chs) ^: (1&<)
函数可以正常工作,但递归调用失败,因为使用列表调用T,然后尝试在列表中生成一个int列表。
如何解决此问题或如何以其他方式编写函数?
答案 0 :(得分:3)
递归动词的一般形式是:
T =: main_body`default_value @. main_or_default_check
默认值和检查很简单:
default_value =: 1"_
main_or_default_check =: 1 = ]
二项式也是标准的,我们可以把它写成
binom =: 4 : '(!x)%((!y)*(!x-y))'
main_body的形式为main_body =: sum binomial(n,i) * T n-i
。我们可以使用助手动词f
作为总和的内部部分,以使事情更清晰:
f =: 4 :'(x binom y) * T x - y'
或以默认形式:f =: binom * [: T -
。
n
对于每次和的迭代都是固定的,而i
从1
变为n-1
(>:i.n-1
)所以:
sum =: 3 :'+/(y&f)"0 >:i.y-1'
将上述内容放在一起:
T =: 3 : '+/(y&f)"0 >:i.y-1'`(1"_)@.(1 = ])
T each >:i.8
┌─┬─┬─┬──┬───┬────┬─────┬──────┐
│1│2│9│52│375│3246│32781│378344│
└─┴─┴─┴──┴───┴────┴─────┴──────┘