J中的多个递归函数调用

时间:2014-05-23 20:17:08

标签: recursion j

我目前正在尝试在J中编写此函数: T(n)=\sum_{i=1}^{n-1}\binom{n}{i}\times T(n-i) (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列表。

如何解决此问题或如何以其他方式编写函数?

1 个答案:

答案 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对于每次和的迭代都是固定的,而i1变为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│
└─┴─┴─┴──┴───┴────┴─────┴──────┘