كيف اقوم بحساب عدد التباديل في قاعدة 3 التوافقية؟

StackOverflow https://stackoverflow.com/questions/447783

  •  22-07-2019
  •  | 
  •  

سؤال

لم أكن الكثير عن الرياضيات وأنا على أمل أن شخصا ما يستطيع مساعدتي بما يلي.

ولدي 5 خانات:

 1   2   3   4   5
[ ] [ ] [ ] [ ] [ ]

ومربعات إما أن يكون أبيض، رمادي، أو أسود (أو التفكير في الأمر على النحو 0، 1، 2)

كم عدد الدول التي ممكن أن مجموعة مربع يكون في؟

ما هو شبة الكود (أو في أي لغة) لتوليد كل النتائج المحتملة؟

وأي ...

00000
00001
00011
00111

والخ، الخ ...

وأنا حقا نقدر أي مساعدة أي شخص يمكن أن تعطيني مع هذا.

هل كانت مفيدة؟

المحلول

وهذه هي مشكلة جيل التقليب الكلاسيكية. لديك 3 الاحتمالات عن كل موقف، و 5 وظائف. العدد الإجمالي للسلسلة التي تم إنشاؤها 3 ^ 5 = 243. تحتاج العودية إذا كنت ترغب في حل عام (حلقة تكرارية بسيطة يعمل فقط لنسخة واحدة من المشكلة).

إليك مثال سريع:

public static void Main(string[] args){

    Generate("", 5);
}

private void Generate(string s, int limit)
{
    if (s.Length == limit)
        Console.WriteLine(s);
    else
    {
        Generate(s+"0", limit);
        Generate(s+"1", limit);
        Generate(s+"2", limit);
    }
}

نصائح أخرى

والإجابة عن عدد من مجموعات هي: 3x3x3x3x3 (3 ^ 5) لأن كل مربع يمكن أن يكون 3 الألوان الممكنة

.

وأما بالنسبة لتوليد نتائج، نرى ما اذا كان يمكنك معرفة ذلك باستخدام هذه المصفوفة مع 0 أو 1 أو 2 لتمثيل لون مربع. على نطاق أصغر (لنفترض 3 صناديق) سيبدو هذا:

0 0 0
0 0 1
0 0 2
0 1 0
0 1 1
0 1 2
0 2 0
0 2 1
0 2 2
1 0 0
1 0 1
1 0 2
1 1 0
1 1 1
1 1 2
1 2 0
1 2 1
1 2 2
2 0 0
2 0 1
2 0 2
2 1 0
2 1 1
2 1 2
2 2 0
2 2 1
2 2 2

لإجابة على سؤالك الأول، ما من شأنه أن يكون الجواب إذا المربعات يمكن أن تحتوي على واحد فقط من قيمتين؟ الأمر كذلك، فما هو الجواب إذا كانت صناديق تحتوي على واحد من ثلاثة القيم؟

لإجابة على سؤالك الثاني، ما شبة الكود يولد جميع النتائج الممكنة من مربع واحد؟ الآن، شبة الكود يولد كل النتائج المحتملة للصندوقين؟

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

وشكرا لكم جميعا على إجاباتك، على الأقل أولئك منكم الذين قدموا لي في الواقع واحدة.

وبينما أنا يمكن أن نقدر أن مسألة يبدو وكأنه تم سحبها مباشرة من علوم الحاسوب 101، لم يكن. المفارقة في الأمر هو أنه كان للحياة الحقيقية على الموعد النهائي الحقيقي وأنا لم يكن لدي الوقت لتعيدنا إلى عندما كان يجري تعلمت هذه الاشياء وقلت لنفسي، "عندما أنا ذاهب من أي وقت مضى في حاجة إلى هذا هراء"

إذا أردت أن يكون رعى وتعامل مثل صبي في مدرسة أود أن أعود إلى مدرستي الابتدائية وأسأل معلمتي الصف 5TH إذا أنا <م> يمكن ذهاب إلى الحمام

وشكرا مرة أخرى

وعدد من الدول هو 3 ^ 5.

وشبة الكود هو

for value from 0 to 3^5-1
    print base3(value)

وحيث base3 هو دالة التي تأخذ مرارا مودولو 3 للحصول على أرقام، ثم يزيل هذا الرقم (بقسمة بنسبة 3)

وتلميح: تخيل أن كل مربع هو موقف في عدد وكل لون رقما مختلفا. في العالم الحقيقي، وكيف العديد من تركيبات (بما في ذلك صفر) لم تحصل مع 2 مناصب و10 أرقام ممكنة؟ ماذا عن 3 وظائف؟ ما هي العلاقة بين إضافة موقف إضافي وعدد من المجموعات، نظرا لعدد الأرقام المتوفرة لديك؟

وعدد فريد من مجموعات: 3^5=243

والرمز:

n = 0
for i = 0 to 3^5-1
{
    s = ""
    for j = 1 to 5
    {
        d = n mod 3
        s = toascii(d) . s
        n = n / 3
    }
    println s
    i = i + 1
}

وهنا هو كيف علم لأول مرة للقيام بذلك: نفكر أولا في كيفية العديد من الخيارات التي تبذلونها. كنت ترغب بجعل خمسة خيارات، واحد لكل مربع. حتى كتابة خمسة أسطر فارغة مع وجود علامات الضرب:

__ x __ x __ x __ x __ = ?

في كل فارغة، وكتابة عدد من الكائنات التي لديك لاختيار من لهذا المربع. منذ لديك 3 أرقام للاختيار من بينها لكل مربع، أن تكتب 3 في كل فارغة:

3 x 3 x 3 x 3 x 3 = 243

وهذا يمنحك عدد التباديل لتلك الخيارات.

وعدد من الاحتمالات من 3 إلى 5 قوة

إذا كنت حلقة من 0 إلى أن عدد ناقص 1 والتعبير عن ذلك في قاعدة 3 سيكون لديك كل الاحتمالات (تذكر من أجل إلحاقها 0S إذا لزم الأمر)

في روبي:

number_of_possibilities = 3**5-1

for i in (0..number_of_possibilities)
  base_3_number = i.to_s(3)
  puts "%05d" % base_3_number # number formatting used to prepend 0s where necessary
end

هل لي أن اسأل ما حول هذا أنت لا تفهم أو ماذا يكون تنطلق لكم؟ وأرى أن الجميع هنا قد أجاب ببساطة السؤال، ولكن إذا قمت بنسخ إجاباتهم، كنت قد تعلمت شيئا، وبالتالي غاب تماما نقطة من الواجبات المنزلية. على افتراض الدرس الخاص بك المقبل يبني على هذا واحد، كنت مجرد الذهاب الى سقوط مزيد من وراء.

إذا إما عملت بالنسبة لي أو كانوا في صفي كنت ببساطة نطلب ما يلي ...

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

وأنا أعلم به ربما بعد فوات الأوان، ولكن لهذه الأسئلة المنزلية أعتقد أننا يجب أن تساعد الشخص تعلم بدلا من مجرد تقديم إجابة وعمل واجباتهم المدرسية بالنسبة لهم.

ومشكلتكم تحتاج شيئا أكثر من من الناتج في التوافقية.

ويمكنك اختيار حالة أولا مربع في 3 طرق، وحالة الثاني مربع في 3 طرق، و... والدولة لل مربع 5TH في 3 طرق. عدد من الطرق التي يمكنك تعيين حالة كافة خانات هو نتاج كل (متساوية) خمسة أرقام من الطرق، أي 3x3x3x3x3 = 3 <سوب> 5 .

والسؤال مماثلة: عدد الأرقام يمكنك تشكل مع 5 أرقام في النظام العشري، عد الأصفار؟ وهذا هو، كم عدد الأرقام هناك 00000-99999؟ يمكنك اختيار الرقم الأول في 10 طرق (0 ... 9)، وهلم جرا وهلم جرا، والجواب هو 10x10x10x10x10 = 100000، كما تعلمون.

وهذا يبدو وكأنه مشكلة الواجبات المنزلية. سوف أعطيكم بعض المساعدة لحل ذلك الحين.

ما تقوله هو أن كل مربع يحتوي ثلاث ولايات، وكلها مستقلة. سوف مربع واحد لديها 3 حلول، وسوف صندوقين لديها 3 * 3 حلول - لكل دولة من المربع الأول أن المربع الثاني لها ثلاث ولايات كذلك. تمديد هذه إلى 5 صناديق.

لتوليد كل حل، يمكنك التنقل فقط من خلال ذلك. فمن السهل أن تجعل متداخلة لحلقات لكل مربع، ويمكن ضرب من قبل قوى 10 تمكنك من إظهار رقم في آن واحد.

ويمكنك تعميم رمز لصناديق متعددة بطريقة مماثلة.

لا تحاول حتى كتابة التعليمات البرمجية للإجابة على هذا! والسبب هو أن كنت بحاجة الى بعض أعداد كبيرة جدا (عاملي) لحساب ذلك. هذه خلق أعداد أكبر بكثير من أي نوع قاعدة في CLR. يمكنك استخدام هذا مفتوحة المصدر مكتبة للقيام بهذا الحساب.

void solve(int p=0,int n=5,int d=0)
{
    if (n==p)
    {
        int rev=d;
        int i=0;
        while (i<5) {
            cout << rev%10;
            rev /= 10;
            i++;## Heading ##
        }
        cout << endl;
        return;
    }
    for(int i=0; i<3 ; i++)
    {
        solve(p+1,n, d*10 + i);
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top