ما هو الفرق بين التكرار في الرياضيات والتكرار في البرمجة؟


الاجابه 1:

على الرغم من ما تقوله الإجابات الأخرى ، نعم. يعني المبرمجون شيئًا مختلفًا قليلاً بمصطلح "العودية" عن علماء الرياضيات.

لكن بدقة أكثر ، يعني مبرمجي اللغات غير النقية شيئًا مختلفًا قليلاً عن مبرمجي اللغات البحتة ، عندما يستخدمون مصطلح "العودية". في حين أن مبرمجي اللغات البحتة يعنيون بالضبط نفس علماء الرياضيات.

والسبب الأساسي هو أن المبرمجين وعلماء الرياضيات يعنيون شيئًا مختلفًا عن طريق "الوظيفة".

في الرياضيات ، تكون "الوظيفة" نقية دائمًا - إنها مجرد تعيين من الوسائط إلى النتائج ، وفي كل مرة تسأل فيها عن نتيجة الوظيفة في بعض الوسائط ، تكون النتيجة هي نفسها. إذا كان لديك تكرار Fibonacci f (n) = f (n-1) + f (n-2) ، يمكنك إعادة استخدام قيمة f (n-2) بأمان كعامل في تعريف f (n) و في تعريف f (n-1). هذا هو بالضبط نفس معنى كلمة "دالة" مثل كلمة "دالة" في لغة برمجة خالصة - يمكنك الكتابة

f n = if n <= 1
ثم 1
آخر f (n-1) + f (n-2)

في Haskell (نعم ، أنا أدرك أنها ليست الطريقة التي يجب "بها" أن تكتبها في Haskell ، لكنني أختار أكثر لإلمام المستخدمين بخلاف Haskell) ، وسيتم تشغيل هذا الرمز في O (n). سيتم تشغيله في O (n) لأن f هي بالضبط "الوظيفة" بالمعنى الرياضي لهذه الكلمة ، أي أن f (n) دائمًا هي نفس القيمة الخالصة لـ n معين ، لذلك بمجرد حساب كل نتيجة f (i) من أجل في المرة الأولى ، يمكن إعادة استخدامها في أي مكان آخر دون حساب النفقات العامة.

و "العودية" Haskell المحددة أعلاه هي بالضبط نفس معنى الرياضيات "العودية" f (n) = f (n-1) + f (n-2).

من ناحية أخرى ، في لغة غير نقية ، يختلف معنى "الوظيفة" ، لأن جسم الوظيفة يمكن أن ينتج آثارًا جانبية. لذلك إذا كتبت

int f (int n) {
إذا كان (n <= 1) بإرجاع 1 ؛
إرجاع f (n-1) + f (n-2) ؛
}

في C ++ / Java / etc ، هذا هو معنى مختلف "العودية" من مثال هاسكل. هذا تكرار سوف يستدعي f على كل n عدة مرات ، مما يؤدي إلى إجمالي المكالمات O (2 ^ n). هذا لأنه إذا كنا نعني "بكلمة" إجراء ، فإننا نحتاج إلى استدعاء الإجراء مرتين إذا ظهر مرتين في جسم العودية.

إذن ما يعنيه المبرمجون للغات غير النقية بكلمة "وظيفة" هو إجراء ينتج عنه [ربما] بعض النتائج ويؤدي بعض الآثار الجانبية. الإجراء نفسه مهم (لأنه يمكن أن يكون له آثار جانبية) ، ويمكن أن ينتج عن البرنامج الذي يستدعي الإجراء مرتين على نفس الوسيطات قيمة مختلفة عن البرنامج الذي يطلق عليه مرة واحدة. بما أن العودية تكون عندما تعتمد الوظيفة على نفسها ، فهذا يعني أن العودية هي الحالة التي تطالب بها نفسها و [ربما] تستخدم النتيجة.

ما يعنيه مبرمجو اللغات الخالصة والرياضيات بكلمة "وظيفة" هو نتيجة لإجراء خالص (بدون آثار جانبية) ، وبالتالي فإن الإجراء نفسه لا صلة له بالموضوع لأنه "فقط" ضروري لإنتاج نتيجة محض. لذا ، فإن "العودية" تعني فقط النتائج التي تعتمد على بعضها البعض ، وليس على "المكالمات" لتعريف الوظيفة نفسها.

نظرًا لأن اللغات البحتة نادرة واللغات غير النقية منتشرة بشكل كبير ، فمن التعميم الآمن الآمن تبسيط الموقف إلى "المبرمجين يعني شيئًا مختلفًا عن علماء الرياضيات".


الاجابه 2:

إجابة غير صارمة هنا:

ستجد "حمولة ، قادرة على حملها بواسطة حمار ، رهنا بالمتغيرات" عند النظر إلى المقارنة بين الرياضيات والحساب (أو كما تصفها ، "البرمجة"). وُلد هذا في شيء يسمى مراسلات كاري هاورد - ويكيبيديا ، التي تقول إن الرياضيات والحساب مترادفان تقريبًا. علاوة على ذلك ، عندما نصل إلى سلم نظرية نوع Homotopy و Univalence Axiom ، يمكنك البدء في افتراض أن المراسلات تمتد من الهندسة ، إلى الحساب ، إلى وضع النظرية ، وإلى معظم الرياضيات.

TL ؛ DR: إنهم متساوون ، على الرغم من أنهم يتحدثون عن استخدامات مختلفة قليلاً.


الاجابه 3:

هل يعني المبرمجون والرياضيون شيئًا مختلفًا عندما يتحدثون عن "العودية"؟

لا أعتقد ذلك.

مع الأخذ في الاعتبار أن الأشخاص الأوائل الذين طوروا علوم الكمبيوتر - تورينج ، الكنيسة ، جودل ، إلخ - كانوا علماء رياضيات.

في حين أن غودل معروف بشكل رئيسي بنظرياته غير المكتملة ، فقد قام بعمل هائل في نظرية الوظائف العودية. كان يحاول حل نفس المشكلة (من ديفيد هيلبرت) التي كان تورينج في عمله الشهير ، وتستخدم أساسا وظائف العودية العامة كأساس لحله. الدوال العودية العامة هي نموذج للحساب ، وبالتالي ترتبط ارتباطًا وثيقًا بعلوم الكمبيوتر والبرمجة.

أعتقد أن الصعوبة تكمن في أن معظم المبرمجين ، وخاصة أولئك الذين ليس لديهم خلفية في علوم الكمبيوتر ، لا يرون صلة بين الرياضيات الخاصة بالتعريف المتكرر مثل:

F0=F1=1Fn=Fn1+Fn2F_0 = F_1 = 1\\
F_n = F_{n-1} + F_{n-2}

وتعريف وظيفة العودية مثل

def fib (n)
  إذا n == 0 || ن == 1
    1
  آخر
    fib (n-1) + fib (n-2)
  النهاية
النهاية

الأمر أكثر وضوحًا بلغة وظيفية مثل هاسكل:

fib :: نات -> نات
فيب 0 = 1
فيب 1 = 1
fib n = fib (n-1) + fib (n-2)

ولكن هذا جزئيًا لأن Haskell صُمم لجعل العلاقة أكثر وضوحًا.

من الصعب ، بطبيعة الحال ، رؤية العلاقة عندما يكون مثال البرمجة أطول ، لكنه موجود بشكل أساسي.

هذا بالطبع يأتي من معسكر "لكن البرمجة هي الرياضيات".


الاجابه 4:

هل يعني المبرمجون والرياضيون شيئًا مختلفًا عندما يتحدثون عن "العودية"؟

لا أعتقد ذلك.

مع الأخذ في الاعتبار أن الأشخاص الأوائل الذين طوروا علوم الكمبيوتر - تورينج ، الكنيسة ، جودل ، إلخ - كانوا علماء رياضيات.

في حين أن غودل معروف بشكل رئيسي بنظرياته غير المكتملة ، فقد قام بعمل هائل في نظرية الوظائف العودية. كان يحاول حل نفس المشكلة (من ديفيد هيلبرت) التي كان تورينج في عمله الشهير ، وتستخدم أساسا وظائف العودية العامة كأساس لحله. الدوال العودية العامة هي نموذج للحساب ، وبالتالي ترتبط ارتباطًا وثيقًا بعلوم الكمبيوتر والبرمجة.

أعتقد أن الصعوبة تكمن في أن معظم المبرمجين ، وخاصة أولئك الذين ليس لديهم خلفية في علوم الكمبيوتر ، لا يرون صلة بين الرياضيات الخاصة بالتعريف المتكرر مثل:

F0=F1=1Fn=Fn1+Fn2F_0 = F_1 = 1\\
F_n = F_{n-1} + F_{n-2}

وتعريف وظيفة العودية مثل

def fib (n)
  إذا n == 0 || ن == 1
    1
  آخر
    fib (n-1) + fib (n-2)
  النهاية
النهاية

الأمر أكثر وضوحًا بلغة وظيفية مثل هاسكل:

fib :: نات -> نات
فيب 0 = 1
فيب 1 = 1
fib n = fib (n-1) + fib (n-2)

ولكن هذا جزئيًا لأن Haskell صُمم لجعل العلاقة أكثر وضوحًا.

من الصعب ، بطبيعة الحال ، رؤية العلاقة عندما يكون مثال البرمجة أطول ، لكنه موجود بشكل أساسي.

هذا بالطبع يأتي من معسكر "لكن البرمجة هي الرياضيات".