В качестве упражнения для начинающих я попытался вычислить следующую сумму в J, sum(1/(1+0.03)^n for n = 1 to 30
, используя +/%(1 + 0.03)^ >:i.30
. Как я могу записать это в простой неявной форме? все, что я пробовал, значительно уродливее, чем явная форма выше, например >:@[ (+/&:%)@:^ >:&i.@]
что такое хорошая неявная форма суммы (1/(1+x)^y) в J
comment
Неявная форма работает для одних расчетов более плавно, чем для других. Поскольку значения должны применяться в формуле нерегулярно, накладные расходы на их передачу в эти точки становятся обременительными. Этот факт обсуждается (в контексте, отличном от J) в сообщении блога, evincarofautumn.blogspot.com/2012/02/ в разделе "Темная сторона". Я думаю, что в имеющейся формуле два аргумента не являются неуклюжими по своей сути, а вместо этого прекрасно обрабатываются крючком, как демонстрирует Tikkanz.
- person kaleidic   schedule 23.02.2013
Ответы (2)
Вы могли бы начать с
+/@:%@((1 + 0.03) ^ >:@i.) 30
Вы можете сделать 0,03 левым аргументом, используя форк, но использование хука может быть чище.
(1 + 0.03) +/@:%@([ ^ >:@i.@]) 30 NB. use fork
(1 + 0.03) +/@:%@(^ >:@i.) 30 NB. use hook
Одна и та же операция (приращение) выполняется как для левого, так и для правого аргументов ^
. Это намек на то, что &
(Compose) может оказаться полезным.
0.03 +/@:%@(^&>: i.) 30 NB. apply increment to both left & right arg
person
Tikkanz
schedule
22.02.2013
Мне нравится, как вы определили приращение как нечто общее для обеих сторон, а также то, как вы используете хук. В данном случае я предпочитаю Кэп, поэтому на данный момент я предпочитаю формулировку
formula=: [: +/ [: % ( ^&>: i.)
.
- person kaleidic; 23.02.2013
Когда мне нужна неявная функция, я часто позволяю 13 :
выбить ее за меня. В этом случае некоторые вариации:
13 : '+/ %((1+0.03)^1+i.y)'
[: +/ [: % 1.03 ^ 1 + i.
13 : '+/ %((1+0.03)^>:i.y)'
[: +/ [: % 1.03 ^ [: >: i.
И с 1+0.03
или чем-то еще в качестве левого аргумента:
13 : '+/ %(x^1+i.y)'
[: +/ [: % [ ^ 1 + [: i. ]
13 : '+/ %(x^>:i.y)'
[: +/ [: % [ ^ [: >: [: i. ]
Слишком много заглавных букв ([:
), чтобы назвать это менее уродливым, но это только начало.
person
MPelletier
schedule
22.02.2013