แสดงลำดับการรวมสองครั้งใน Raku


13

วิธีการแสดงลำดับคู่บวกคู่ตัวแปรใน Perl 6?

สำหรับตัวอย่างของตัวแปร double summation doubleดูได้

ภาพ

มันจะต้องแสดงตามที่เป็นอยู่คือไม่มีการลดลงในการรวมคู่เดียวทางคณิตศาสตร์ ขอบคุณ.

คำตอบ:


14

X(ผู้ประกอบการข้าม) และ[+](metaoperator ลด[ ]กับผู้ประกอบการสารเติมแต่ง+) ทำให้เรื่องนี้น่าแปลกใจที่ง่าย:

ในการแทน1การรวมคู่∑³ x  = 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]คำนวณข้ามซ้ำเช่น[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.ขออภัยดังนั้นอย่าปล่อยให้ฉันทำ LaTeX แต่คุณควรได้รับแนวคิด 2.ใช่ฉันรู้ว่าเป็นตัวอักษรตัวห้อย O ไม่ใช่ตัวเลขตัวห้อยไม่ใช่ตัวระบุที่ถูกต้องตามปกติ แต่คุณสามารถใช้คำสแลง :: ตัวห้อยเพื่อเปิดใช้งานได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.