राकु में दोहरा योग अनुक्रम व्यक्त करना


13

पर्ल 6 में दोहरे चर डबल समन अनुक्रम को कैसे व्यक्त करें ?

डबल चर डबल समेशन अनुक्रम के एक उदाहरण के लिए यह देखें

छवि

इसे व्यक्त किया जाना चाहिए, अर्थात बिना गणितीय रूप से दोहरे योग को एक ही योग में घटाया जा सकता है। धन्यवाद।

जवाबों:


14

X(क्रॉस ऑपरेटर) और [+](कमी metaoperator [ ]additive ऑपरेटर के साथ +) इस आश्चर्यजनक रूप से आसान बनाने:

का प्रतिनिधित्व करने के 1 डबल योग Σ³ एक्स  = 1 Σ⁵ y  = 1 2x + y , आप निम्न कर सकते हैं:

  [+] 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

यदि आप इसके लिए बनाना चाहते हैं sub, तो आप इसे निम्नलिखित 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 }

या यहां तक ​​कि चीजों को अधिक सरल बनाते हैं

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 ;-) 

ध्यान दें कि इसे टाइप करके, हम यह सुनिश्चित कर सकते हैं कि सीमाएँ पास की जा सकती हैं, लेकिन इसे टाइप करने के Iterableबजाय Rangeहम और अधिक दिलचस्प योगों की अनुमति दे सकते हैं, जैसे, कहते हैं, ΣΣ (1..∞).grep(*.is-prime)[^99], 1..10, { … }कि हम पहले 100 primes के अनुक्रम का उपयोग करेंगे।

वास्तव में, अगर हम वास्तव में चाहते थे, तो हम ओवरबोर्ड जा सकते थे, और एक मनमाना गहराई से योग करने वाले ऑपरेटर के लिए अनुमति दे सकते हैं, जिसे फ़ंक्शन को बाईं ओर ले जाकर सबसे आसान बनाया जाता है:

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;
};

वैसे ही जैसे [+]हमारे के सभी मानों को रकम f()समारोह, [X]iteratively पार, जैसे की गणना करता है, [X] 0..1, 3..4, 5..6पहले करता है 0..1 X 3..4या (0,3),(0,4),(1,3),(1,4), और उसके बाद करता है (0,3),(0,4),(1,3),(1,4) X 5..6, या (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. क्षमा करें, SO ने मुझे LaTeX नहीं करने दिया, लेकिन आपको यह विचार करना चाहिए। 2. हाँ, मुझे पता है कि एक सबस्क्रिप्ट लेटर O शून्य नहीं है, सबस्क्रिप्ट नंबर सामान्य रूप से मान्य पहचानकर्ता नहीं हैं, लेकिन आप उन्हें सक्षम करने के लिए स्लैंग :: सब्सक्राइबर्स का उपयोग कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.