ภาษาการเขียนโปรแกรมใช้ตัวแปรขณะที่อยู่ในคณิตศาสตร์หรือไม่?


11

ในคณิตศาสตร์ตัวแปรหมายถึงคุณสามารถใส่ตัวเลขใด ๆ ได้และสมการจะยังคงเป็นจริง:

root(square(x)) = abs(x)

ในภาษาการเขียนโปรแกรมไม่เป็นเช่นนั้น: var สามารถเปลี่ยนแปลงได้ ใน Python:

y = (x**2)**.5
x *= 2
assert y == abs(x)

จะเพิ่มข้อยกเว้นเนื่องจาก x ในบรรทัดสุดท้ายนั้นไม่เหมือนกัน

มีภาษาการเขียนโปรแกรมที่ใช้ตัวแปรที่ไม่เปลี่ยนแปลงหรือไม่?


5
ในคณิตศาสตร์สมการส่วนใหญ่ไม่ใช่อัตลักษณ์ ตัวอย่างเช่น x ^ 2 + 5 = 6x ถูกต้องหาก x = 1 หรือ x = 5 สมการที่ใช้ได้สำหรับทุกค่าใน "จักรวาล" บางอย่าง (เช่นชุดของจำนวนจริงทั้งหมด) เช่น sin ( 2x) = 2 บาป x cos x จะถูกเรียกว่าอัตลักษณ์
Andreas Rejbrand

4
ตัวแปรในคณิตศาสตร์! = ตัวแปรในภาษาการเขียนโปรแกรม ฉันมักจะคิดว่าพวกเขาควรมีชื่อที่แตกต่างกันเช่นกันเนื่องจากมีคนจำนวนมากสับสนเมื่อพวกเขานำความคิดเกี่ยวกับตัวแปรในคณิตศาสตร์มาสู่การเขียนโปรแกรม
Lie Ryan

1
ฉันคิดว่าเป้าหมายของตัวแปรในคณิตศาสตร์นั้นไม่เหมือนกับในการเขียนโปรแกรม ในคณิตศาสตร์ตัวแปรแสดงถึงค่าที่ไม่รู้จักที่คุณต้องการทราบหรือวางลงในสูตรที่คุณใส่ค่าเพื่อให้ได้ผลลัพธ์ สำหรับภาษาโปรแกรมทั่วไปเฉพาะกรณีที่สองเท่านั้นที่เหมาะสม สำหรับกรณีแรกคุณจะต้องใช้ซอฟต์แวร์เช่น Mathematica
Pagotti

ไม่พวกเขาทำไม่ได้ ลองใส่ตัวเลขใด ๆลงบน "x = 5"

คำตอบ:


6

ในการตอบคำถามไตเติ้ลของคุณ "ภาษาการเขียนโปรแกรมใช้ตัวแปรตามที่อยู่ในคณิตศาสตร์หรือไม่": C, C #, Java, C ++ และภาษาอื่น ๆ ของ C สไตล์ใช้ตัวแปรในวิธีที่พวกเขาใช้ในคณิตศาสตร์

คุณเพียงแค่ต้องใช้ == แทนที่จะเป็น =

ถ้าฉันใช้ต้นฉบับของคุณ

root(square(x)) = abs(x)

จากนั้นฉันสามารถแปลให้เป็น C # โดยตรงโดยไม่มีการเปลี่ยนแปลงใด ๆ นอกจากไวยากรณ์ Math.Sqrt(Math.Pow(x,2)) == Math.Abs(x)

สิ่งนี้จะประเมินว่าเป็นจริงสำหรับค่าใด ๆ ของ x ตราบเท่าที่ x กำลังสองน้อยกว่าค่าสูงสุดสำหรับประเภทข้อมูลที่คุณใช้ (Java จะคล้ายกันอย่างไม่มีการลด แต่ฉันเชื่อว่า Math namespace แตกต่างกันเล็กน้อย)

บิตถัดไปนี้จะไม่สามารถคอมไพล์ใน C # ได้เนื่องจากคอมไพเลอร์ฉลาดพอที่จะรู้ว่าฉันไม่สามารถกำหนดการส่งคืนการดำเนินการหนึ่งให้กับการดำเนินการอื่นได้

Math.Sqrt(Math.Pow(x,2)) = Math.Abs(x)

ความไม่สามารถเปลี่ยนแปลงได้ไม่เกี่ยวข้องกับสิ่งนี้ คุณยังคงต้องกำหนดค่าในภาษาที่ไม่เปลี่ยนรูปแบบและเป็นไปได้อย่างสมบูรณ์ว่าภาษาที่ระบุอาจเลือกทำเช่นนี้โดยใช้ = เป็นผู้ดำเนินการ

การพิสูจน์จุดเพิ่มเติมการวนซ้ำนี้จะทำงานจนกว่าคุณจะหมดคุณค่าทางกฎหมายของ x และรับข้อยกเว้นมากเกินไป:

 while (Math.Sqrt(Math.Pow(x, 2)) == Math.Abs(x))
        {
            ++x;
            System.Console.WriteLine(x);
        }

นี่คือเหตุผลที่นักคณิตศาสตร์เกลียดการใช้ = สำหรับการมอบหมาย มันทำให้พวกเขาสับสน ฉันคิดว่าสิ่งนี้ทำให้คุณสับสน นำตัวอย่างของคุณ

y = (x**2)**.5
x *= 2
assert y == abs(x)

เมื่อฉันเปลี่ยนมันเป็นพีชคณิตฉันจะได้:

abs (2x) = root (x ^ 2)

ซึ่งแน่นอนว่าไม่เป็นความจริงสำหรับค่าอื่น ๆ นอกเหนือจาก 0 การไม่เปลี่ยนรูปจะช่วยให้คุณประหยัดจากข้อผิดพลาดในการเปลี่ยนค่าของ x เมื่อคุณเพิ่มขั้นตอนพิเศษระหว่างการประเมินด้านซ้ายมือและด้านขวามือของสมการดั้งเดิม มันไม่ได้เปลี่ยนวิธีที่คุณประเมินนิพจน์


24

ภาษาโปรแกรมที่ใช้งานได้จริงเช่นHaskellบังคับใช้ตัวแปรที่ไม่เปลี่ยนรูป ฉันชอบที่จะเรียกพวกเขาว่าตัวระบุแทนตัวแปร


3
ใน Erlang ซึ่งเป็นภาษาที่ใช้งานไม่ได้จริงตัวแปรก็ไม่เปลี่ยนรูปเช่นกัน
sepp2k

ฉันไม่รู้จัก Erlang มากเกินไป นั่นคืออะตอมใช่มั้ย Erlang อนุญาตให้ใช้ที่เก็บข้อมูลแบบแปรผันได้หรือไม่?
Ionuț G. Stan

3
@Ionut: ไม่อะตอมของเออร์แลงเป็นสิ่งที่เรียกว่าสัญลักษณ์ในแบบ lisp และ ruby เกี่ยวกับคำถามที่สองของคุณ: มีพจนานุกรมกระบวนการซึ่งเป็นโกลบอล (ดี, ต่อกระบวนการ), แฮชแผนที่ที่ไม่แน่นอน อย่างไรก็ตามมันก็ไม่ค่อยมีใครใช้ในประสบการณ์ของฉัน นอกเหนือจากนั้นวิธีเดียวที่จะทำลายความโปร่งใสในการอ้างอิงคือการส่งข้อความ
sepp2k

4
หืมมมฉันควรจะเรียนรู้ด้วยตัวเองบาง Erlang :)
Ionut จีสแตน

คำถามนี้ถามคำถามนี้อย่างไร
ริ้น

5

=สัญญาณที่ใช้ในการเขียนโปรแกรมภาษาเป็นความเข้าใจผิด <-หมายถึง "store" หรือแม้แต่ COBOL MOVEควรใช้แทน

นอกจากนี้ Prolog ใช้ตัวแปรเช่นคณิตศาสตร์: ตัวแปรไม่สามารถเปลี่ยนแปลงได้และเอ็นจิน Prolog จะเติมข้อมูลในตัวแปรเพื่อดูว่ามีคำตอบอยู่หรือไม่

นอกจากนี้ Curry ยังเป็นส่วนผสมของ Haskell และ Prolog


3

C, C ++ และ Objective-C สามารถระบุ immutability สำหรับฟังก์ชัน (และเมธอด) อาร์กิวเมนต์รวมถึงตัวแปรอื่น ๆ (ตัวระบุ) ด้วยตัวระบุชนิด "const"


3

คุณสามารถจำลองการเปลี่ยนแปลงในPython ได้เช่นกันโดยไม่อนุญาตให้มีการอัพเดตคลาส ตามที่ระบุไว้ก่อนหน้าภาษาการเขียนโปรแกรมการทำงานที่บริสุทธิ์ที่สุดบังคับใช้ไม่ได้ Clojureเป็นส่วนเสริมล่าสุดของแพลตฟอร์มJVM (Clojure เป็นภาษา LISP)

ในScala (เช่นภาษาJVM ) unifier ของ OO และ FP สนับสนุนตัวแปรที่ประกาศด้วยvalจะไม่เปลี่ยนรูป Scala ลึกซึ้งและ OO สนับสนุน / ไฮบริด FP ทำให้ดูคล้ายกับ Mathematica ( Akkaเป็นเฟรมเวิร์กที่เพิ่มฟังก์ชั่น Erlang OTP และ Clojure เช่น STM .. ถึง Scala และ Java) LACASAเพิ่มประเภทระบบและรูปแบบการเขียนโปรแกรมเพื่อบังคับใช้ระเบียบความสามารถของวัตถุใน Scala และเพื่อให้การอ้างอิงวัตถุที่ไม่ซ้ำกัน ( รหัส ) ( พื้นหลังทางทฤษฎี )

ใน Java ตัวแปรที่ประกาศfinalนั้นไม่สามารถเปลี่ยนแปลงได้และไลบรารี Java เช่นGoogle Guava จะรวมไลบรารีของคอลเลกชันที่ไม่เปลี่ยนรูป Java Strings ยังไม่เปลี่ยนรูปเสมอ

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