سؤال

أنا أعمل حاليًا على مهمة الواجب المنزلي لتوليد ما يعرف باسم مثلث باسكال في بيثون.

حتى الآن ، هذا ما لدي:

def mytri(myrange):
    trianglevar = [[1]]
    for i in range(1, myrange):
        tempvar = [1]
        for n in range(0, i-1):
            tempvar.append(trianglevar[i-1][n]+trianglevar[i-1][n+1])
        tempvar.append(1)
        trianglevar.append(tempvar)
    return trianglevar

def mymenu():
    for i in mytri(int(raw_input("Please enter the height of the triangle: "))):
        print i
    print '\n'
    choicevar = raw_input("Would you like to create another triangle? (y/n): ")
    if choicevar == "y":
        mymenu()
    else:
        print "Goodbye."

mymenu()

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

ومع ذلك ، لست متأكدًا من كيفية تنسيق مثلث بلدي. يطبع حاليًا على النحو التالي:

[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
...etc.

الإخراج الذي أريده هو:

        [1]
      [1, 1]
    [1, 2, 1]
  [1, 3, 3, 1]
[1, 4, 6, 4, 1]
...etc.

(إنه خارج قليلاً بسبب الأقواس/الفواصل ، لكنني أحاول فقط الحصول على التنسيق العام في الوقت الحالي.)

شكرا لكل مساعدة تقدمها!

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

المحلول

h = int(raw_input("Please enter the height of the triangle: "))
for i in mytri(h):
    print " " * (h * 2), i
    h -= 1

حتى هنا تقوم بطباعة مساحتين لكل مستوى من هرم. يتم وضع مسافة بادئة للسطر الأول بمقدار ضعف عدد المساحات. كما تنحدر مستوى واحد ، يمكنك تقليل المسافة البادئة بمقدار 2.

نصائح أخرى

وهنا تلميحات زوجين. محاولة:

' ' * someNumber

للتباعد. إذا كنت لا تريد قوسين القائمة ، فيمكنك الحلقة فوق الصف:

for el in i:
  # Write el as you want

او استعمل join.

قد تجد أيضًا enumerate من المفيد الحصول على مؤشرات (على سبيل المثال للتباعد).

بمجرد حصولك على صفوفك ، من المحتمل أن يكون لديك الصف الأخير كأطول.

نظرًا لأنك فقط تطبعها ، يمكنك بعد ذلك أخذ l = len(str(rows[-1])) ثم ، اجمع ذلك مع أ str(rows[i]).center(l) لكل صف.

تعديل: لم يكن على علم بأننا يجب أن نعطي جميع الإجابات على الواجبات المنزلية ... إذا كان الأمر كذلك:

def mytri(myrange):
    rows = list()
    lr = None # Last row

    for i in xrange(myrange+1):
        try:
            lr = [1] + [lr[i] + lr[i+1] for i in range(len(lr) - 1)] + [1]
        except TypeError:
            lr = [1]
        #rows.append(str(lr))
        rows.append(' '.join(str(v) for v in lr))
    return rows

rows = mytri(10)
l = len(rows[-1])
print '\n'.join(v.center(l) for v in rows)

سوف الإخراج

                 1                 
                1 1                
               1 2 1               
              1 3 3 1              
             1 4 6 4 1             
           1 5 10 10 5 1           
          1 6 15 20 15 6 1         
        1 7 21 35 35 21 7 1        
       1 8 28 56 70 56 28 8 1      
    1 9 36 84 126 126 84 36 9 1    
1 10 45 120 210 252 210 120 45 10 1

بدلاً من تجديد الصفوف السابقة في كل تكرار ، يمكنك إنتاج كل صف أثناء إنشاءه:

def mytri(height):
  start = [1]
  for _ in xrange(height):  # "_" for an unused variable
    yield start  # loop written "backwards" for simplicity,
    # though this does generate one unused row
    next_row = [1]
    for a, b in zip(start, start[1:]):  # slicing creates a new list, not a
      next_row.append(a + b)            # concern for this problem, but in
    next_row.append(1)                  # others you could use itertools.islice
    start = next_row                    # to avoid that

الآن تعداد الارتفاع للخلف مع كل صف:

height = int(raw_input("Height: "))
for n, row in zip(xrange(height - 1, -1, -1), mytri(height)):
  print "   " * n, " ".join("%5d" % x for x in row)

لن يصطف هذا بسرعة مع العديد من الصفوف ، ولكن يجب أن يتجه في الاتجاه الصحيح.

تحتاج إلى وضع جميع الأرقام حتى تكون نفس العرض
تحتاج أيضًا إلى إضافة بعض الحشو إلى الجانب الأيسر

def mymenu():
    res = mytri(int(raw_input("Please enter the height of the triangle: ")))
    width = len(str(res[-1][len(res[-1])/2]))
    for i, row in enumerate(res):
        print " "*(width*(len(res)-i)/2)+" ".join(str(x).rjust(width) for x in row)
    print '\n'
    choicevar = raw_input("Would you like to create another triangle? (y/n): ")
    if choicevar == "y":
        mymenu()
    else:
        print "Goodbye."

انتاج:

Please enter the height of the triangle: 10
                1 
              1   1 
             1   2   1 
           1   3   3   1 
          1   4   6   4   1 
        1   5   10  10  5   1 
       1   6   15  20  15  6   1 
     1   7   21  35  35  21  7   1 
    1   8   28  56  70  56  28  8   1 
  1   9   36  84 126 126  84  36  9   1 
n=input('enter n:')
z=0
d=' '
while z<n:
        d=d+'   '
        z=z+1
print d,1
l1=[1]
l2=[1,1]
def space(n,a):
        s=''
        while a<n:
        s=s+' '
        a=a+1
        return s
def digit(n):
        r=1
        k=0
        while r!=0:
            r=n/10**k
            k=k+1
        return k-1
def print_l(l1,b):
        d=''
        d='\n'+space(b-1,0)*3
        i=0
        while i<len(l1):
            d=d+' '*(6-digit(l1[i]))+str(l1[i])
            i=i+1
        print d
b=n-1
k=1
while k<n:
        l2=l1
        l1=[1]
        i=1
        while len(l1)<len(l2):
            if i>len(l2)/2:
                l1.append(l1[len(l2)-i])
            else:
                l1.append(l2[i-1]+l2[i])
            i=i+1   
        k=k+1
        l1.append(1)
        print_l(l1,b)
        b=b-1
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top