রাকুতে দ্বৈত সংক্ষেপণের ক্রম প্রকাশ করা


13

পার্ল 6 এ ডাবল ভেরিয়েবল ডাবল সামিশন ক্রমটি কীভাবে প্রকাশ করবেন ?

ডাবল ভেরিয়েবলের উদাহরণস্বরূপ ডাবল সমষ্টি ক্রম এটি দেখুন

ভাবমূর্তি

এটি অবশ্যই যেমন প্রকাশ করতে হবে, তেমনি গাণিতিকভাবে দ্বৈত যোগফলকে একটি একক সংমিশ্রণে হ্রাস না করে। ধন্যবাদ.

উত্তর:


14

X(ক্রশ অপারেটর) এবং [+](হ্রাস metaoperator [ ]যুত অপারেটর সঙ্গে +) এই আশ্চর্যজনক সহজ করে:

প্রতিনিধিত্ব করতে 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 টি প্রাইমের ক্রম ব্যবহার করবে।

প্রকৃতপক্ষে, আমরা যদি সত্যিই চাইতাম তবে আমরা ওভারবোর্ডে যেতে পারি এবং স্বেচ্ছাসেবী গভীরতার সমষ্টি অপারেটরের জন্য অনুমতি দিতে পারি, যা ফাংশনটি বামে সরিয়ে দিয়ে সবচেয়ে সহজ করা হয়:

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)


১. দুঃখিত, সুতরাং আমাকে ল্যাটেক্স করতে দেয় না, তবে আপনার ধারণাটি পাওয়া উচিত। ২. হ্যাঁ, আমি জানি এটি একটি সাবস্ক্রিপ্ট চিঠি হে শূন্য নয়, সাবস্ক্রিপ্ট নম্বরগুলি সাধারণত বৈধ শনাক্তকারী নয়, তবে এগুলি সক্ষম করতে আপনি স্ল্যাং :: সাবস্ক্রিপ্ট ব্যবহার করতে পারেন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.