Perl 6'da çift değişkenli çift toplama dizisini nasıl ifade edebilirim ?
Çift değişkenli çift toplama dizisi örneği için bkz.
Çift toplamı matematiksel olarak tek bir toplama indirgemeksizin olduğu gibi ifade edilmelidir. Teşekkür ederim.
Perl 6'da çift değişkenli çift toplama dizisini nasıl ifade edebilirim ?
Çift değişkenli çift toplama dizisi örneği için bkz.
Çift toplamı matematiksel olarak tek bir toplama indirgemeksizin olduğu gibi ifade edilmelidir. Teşekkür ederim.
Yanıtlar:
X
(Çapraz operatör) ve [+]
(redüksiyon metaoperator [ ]
ilave operatör ile +
) şaşırtıcı bu hale:
1 çift toplamını temsil etmek için ∑³ x = 1 ∑⁵ y = 1 2x + y , aşağıdakileri yapabilirsiniz:
[+] do for 1..3 X 1..5 -> ($x, $y) { 2 * $x + $y }
# for 1..3 X 1..5 # loop cross values
# -> ($x, $y) # plug into x/y
# { 2 * $x + $y } # calculate each iteration
# do # collect loop return vals
# [+] # sum them all
Bunun için bir oluşturmak sub
istiyorsanız, aşağıdaki gibi yazabilirsiniz 2
sub ΣΣ (
Int $aₒ, Int $aₙ, # to / from for the outer
Int $bₒ, Int $bₙ, # to / from for the inner
&f where .arity = 2 # 'where' clause guarantees only two params
) {
[+] do for $aₒ..$aₙ X $bₒ..$bₙ -> ($a, $b) { &f(a,b) }
}
say ΣΣ 1,3, 1,5, { 2 * $^x + $^y }
Veya daha da basitleştirmek için
sub ΣΣ (
Iterable \a, # outer values
Iterable \b, # inner values
&f where .arity = 2) { # ensure only two parameters
[+] do f(|$_) for a X b
}
# All of the following are equivalent
say ΣΣ 1..3, 1..5, -> $x, $y { 2 * $x + $y }; # Anonymous block
say ΣΣ 1..3, 1..5, { 2 * $^x + $^y }; # Alphabetic args
say ΣΣ 1..3, 1..5, 2 * * + * ; # Overkill, but Whatever ;-)
Bunu yazarak, aralıkların geçildiğinden emin olabiliriz, ancak yazmak Iterable
yerine Range
, örneğin ΣΣ (1..∞).grep(*.is-prime)[^99], 1..10, { … }
ilk 100 primerin sırasını kullanmamıza izin verecek gibi daha ilginç toplama dizilerine izin verebileceğimizi unutmayın .
Aslında, gerçekten isteseydik, denize girebilir ve fonksiyonu sola hareket ettirerek en kolay hale getirilen keyfi bir derinlik toplama operatörüne izin verebiliriz:
sub ΣΣ (
&function,
**@ranges where # slurp in the ranges
.all ~~ Iterable && # make sure they're Iterables
.elems == &function.arity # one per argument in the function
) {
[+] do function(|$_) for [X] @ranges;
};
Tıpkı fonksiyonumuzun [+]
tüm değerlerini özetlediği gibi f()
, [X]
çarpıyı yinelemeli olarak hesaplar, örneğin, [X] 0..1, 3..4, 5..6
önce yapar 0..1 X 3..4
veya (0,3),(0,4),(1,3),(1,4)
sonra yapar (0,3),(0,4),(1,3),(1,4) X 5..6
, veya (0,3,5),(0,4,5),(1,3,5),(1,4,5),(0,3,6),(0,4,6),(1,3,6),(1,4,6)
.
1. Üzgünüm, SO LaTeX yapmama izin vermiyor, ama fikri almalısın. 2. Evet, bunun sıfır olmayan bir alt simge O olduğunu biliyorum, alt simge numaraları normal olarak geçerli tanımlayıcılar değildir, ancak bunları etkinleştirmek için Argo :: Aboneliklerini kullanabilirsiniz.