פייתון/פייתון גרסה 3/אמת בלולאה

מתוך testwiki
גרסה מ־20:11, 30 ביולי 2018 מאת imported>Mathreturn (יצירת דף עם התוכן "thumb|right|300px| צרו את התכנית הבאה: נקודד הסטה מעגלית (Cyclic code). הסטה מעגלית או צ...")
(הבדל) → הגרסה הקודמת | הגרסה האחרונה (הבדל) | הגרסה הבאה ← (הבדל)
קפיצה לניווט קפיצה לחיפוש

צרו את התכנית הבאה:

נקודד הסטה מעגלית (Cyclic code). הסטה מעגלית או ציקלית היא פונקציה הבודקת האם רשימה אחת זהה לרשימה אחת.

נעזר בדומה, תהי lst1=[1,2,3,4], lst2=[3,4,1,2]

בכל בדיקה מסיטה מעגלית הפונקציה את הרשימה הנבדקת במיקום אחד, כלומר lst2=[2,3,4,1]

במידה ובאחת ההסטות שתי הרשימות שוות תחזיר הפונקציה אמת.

קידוד

האלגוריתם אותו בנינו מבוסס על דרך השלילה:

  1. אם אורכי הרשימות אינו זהה - החזר שקר.
  2. בצע הזזה של הרשימה השנייה shift פעמים כאשר 1shiftlen(lst1)
    • השווה את כל אחד מהמיקומים של lst1 אל המיקום בפונקציה השנייה לאחר ביצוע ההסטה.
      • אם איבר במיקום אחד אינו זהה לשני - הפסק את הבדיקה והסט שוב את הרשימה
      • אחרת, הרשימות זהות ולכן תתבצע ההתניה המותנת (מדוע? ראה טווח של ביצוע מותנה).
def cyclic(lst1, lst2):
    '''
    a cyclicfunction
    :param lst1: a list
    :param lst2: a lsit
    :return: boolean
    '''
    if len(lst1) != len(lst2):
        return False
    else:  # same len
        if lst1 == lst2:         # compare the two list without moving:
            return True
        else: # shift lst2

            #first loop
            for shift in range(len(lst1)): #creates shift lists

                true_in_loop = True  # if lst1!=lst2 in each one of the shift-runings change the variable to False

                #second loop:
                for spot in range(len(lst1)): # checks if spot_n in lst1 equals to (spot + shift)/(lst1) in lst2:
                    if lst1[spot] != lst2[(spot + shift) % (len(lst1))]:
                        true_in_loop = False
                        break
                            # if one value is different - break the second loop and go to the next shift-list.
                            # else, go to conditional operation 
                if true_in_loop:  # if one of the shift-runings  return true than lst2 is cyclic of lst1
                    return True