2013-02-22 2 views
3

В качестве упражнения для начинающих я попытался рассчитать следующую сумму в J, sum(1/(1+0.03)^n for n = 1 to 30, используя +/%(1 + 0.03)^ >:i.30. Как я могу написать это в простой негласной форме? все, что я пробовал, значительно уродливее, чем явный вид выше, например, >:@[ (+/&:%)@:^ >:&[email protected]]Что такое хорошая негласная форма суммы (1/(1 + x)^y) в J

+2

Tacit form работает намного плавно для некоторых расчетов, чем другие. Поскольку значения необходимо применять нерегулярно в пределах формулы, накладные расходы на их прохождение через эти точки становятся обременительными. Этот факт обсуждается (в контексте не-J) в сообщении в блоге, http://evincarofautumn.blogspot.com/2012/02/why-concatenative-programming-matters.html, под заголовком раздела «Темная сторона», , В приведенной формуле я считаю, что два аргумента не являются по своей сути неуклюжими, но вместо этого обрабатываются крючком, как показывает Тикканц. – kaleidic

ответ

3

Вы могли бы начать с

+/@:%@((1 + 0.03)^>:@i.) 30 

Вы можете сделать 0,03 левый аргумент с помощью вилки, но с использованием крюка может быть чиста

(1 + 0.03) +/@:%@([^>:@[email protected]]) 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 
+0

Мне нравится, как вы определили прирост в нечто общее с обеими сторонами, а также ваше использование крючка. Я предпочитаю Cap в этом случае, поэтому фразировка, которую я одобряю в данный момент, это 'formula =: [: +/[:% (^ &>: i.)' – kaleidic

1

Когда я хочу использовать неявную функцию, я часто даю 13 : ударить его мне. В этом случае некоторые варианты:

13 : '+/ %((1+0.03)^1+i.y)' 
[: +/ [: % 1.03^1 + i. 

    13 : '+/ %((1+0.03)^>:i.y)' 
[: +/ [: % 1.03^[: >: i. 

И с 1+0.03 или независимо от того, как leftargument:

13 : '+/ %(x^1+i.y)' 
[: +/ [: % [^1 + [: i. ] 

    13 : '+/ %(x^>:i.y)' 
[: +/ [: % [^[: >: [: i. ] 

Там будут слишком много колпачков ([:) называть его менее уродливым, хотя, но это Начало.