Labas, Pasauli!

Python ciklai

VP
Vilius P.
2024-06-22
2024-09-24

Susipažinsime su dar vienu programavimo sintaksės elementu - ciklais (angl. loops).

Žodynėlis

Tam, kad galėtume kalbėti apie ciklus, reikia išsiaiškinti keletą sąvokų, kurios bus vėliau naudojamos aiškinantis pagrindinius principus.

Ciklas - operacijų (ar komandų, ar kodo eilučių) seka, kuri kartojama, iki kol pasiekama nurodyta sąlyga. Čia sąlyga ta pati, kurią rašėme if sakiniuose.

Iteracija - vienas ciklo operacijų įvykdymas (pakartojimas).

Ciklo kintamasis - kintamasis, skirtas saugoti iteracijos reikšmei. Dažniausiai tai bus atskiri sąrašo elementai, iteracijos numeris (0-oji, 1-oji, 2-oji ir t.t. iteracija).

Ciklas darbui su sekomis (for)

Pirma susipažinsime su baigtinį (iš anksto žinomą) iteracijų skaičių vykdomą ciklą. Šiam ciklui suprasti ir naudoti svarbu žinoti praeitos pamokos medžiagą apie sąrašus.

Jeigu norėsim atlikti operacijas, modifikacijas, agregacijas su įvairiais sąrašo elementais - Python kalboje naudosime for ciklus. Panaudokime pažymių sąrašą ir sakykime, kad norime tiesiog jį atspausdinti konsoliniame lange:

.py
grades=[3, 5, 3, 7, 7, 5, 9]
for grade in grades:
    print(grade) # prints: 3, 5, 3, 7, ..., 9

Pirmoje eilutėje sukurtas sąrašas su pažymiais (sveikieji skaičiai). Toliau panaudojama ciklo sintaksė, kuriame nurodomas ciklo kintamasis (grade) ir sąrašas (grades), o gale dedamas dvitaškis (:). Po dvitaškio visos operacijos, kurias norima atlikti n kartų, rašomos atitraukus nuo krašto (tai galite padaryti su tab klavišu). Dar turėtų būti neaišku, toliau skaitant ir analizuojant, bus tik geriau.

O gal galima tą patį padaryti be ciklo?

.py
grades=[3, 5, 3, 7, 7, 5, 9]
grade=grades[0]
print(grade) # prints: 3
grade=grades[1]
print(grade) # prints: 5
grade=grades[2]
print(grade) # prints: 3
grade=grades[3]
print(grade) # prints: 7
grade=grades[4]
print(grade) # prints: 7
grade=grades[5]
print(grade) # prints: 5
grade=grades[6]
print(grade) # prints: 9

Jeigu (grades) sąrašas turėtų 1000 pažymių? Pirmu atveju, kode niekas nesikeistų, antru atveju reiktų prirašyti virš tūkstančio eilučių.

Bendra for ciklo šabloną galima užrašyti šitaip:

.py
for loop_variable in list_variable:
    operation_1
    operation_2
    operation_3
    ...
    operation_n

Čia loop_variable kintamojo vardas, kurį patys galite sugalvoti. Jeigu turime sąrašą pažymių, tai ciklo kintamąjį pavadinsime „pažymys“, jeigu turime sąrašą temperatūrų, ciklo kintamąjį pavadinsime „temperatūra“. Su šiuo kintamuoju, kiekvienoje iteracijoje pasieksime pavienius sąrašo reikšmes.

Funkcija range()

Norint atlikti iteracijas kartų, neturint sąrašo, reikia naudoti range(). Šią funkcija reikia įrašyti vietoje anksčiau rašytos sąrašo reikšmės. Tarkime norime daryti iteracijas 10 kartų:

.py
for i in range(10):
    print(i) # prints: 0, 1, 2, 3, 4, ..., 9

Auksčiau esantyis kodas atspausdins skaičius nuo 0 iki 10 (neįskaitant). Šiame kode panaudota viena iš programuotojų „tradicijų“ - kai ciklo kintamasis yra iteracijos numeris, tai šis kintamasis pavadinamas i.

Funkcijai range() galima pateikti ir daugiau argumentų. Galima nurodyti ciklo kintamojo pradinę reikšmę:

.py
for i in range(5, 10):
    print(i) # prints: 5, 6, 7, 8, 9

Šį kartą i kintamasis įgauna reikšmes nuo 5 (įskaitant) iki 10 (neįskaitant).

Liko dar vienas nepanaudotas funkcijos range() argumentas. Galima kiekvieną ciklo kintamojo reikšmę didinti kas kažkokį skaičių:

.py
for i in range(5, 21, 5):
    print(i) # prints: 5, 10, 15, 20

Įrašėme trečiąjį argumentą, kuriuo nurodėme, kad ciklo kintamojo reikšmės didėtų po 5 vienetus nuo 5 (įskaitant) iki 21 (neįskaitant).

Funkcija enumerate()

Su enumerate() funkcija galima kurti ciklą kartu sužinant ir tos iteracijos indeksą. Kol kas, šią funkciją teks naudoti, nežinant jos visų ypatumų. Tarkime, reikia sudėti visus sąrašo skaičius, kurių vieta sąraše yra nelyginė. Pirma tai atlikime, be enumerate() funkcijos.

.py
numbers=[-10, 50, 200, 200, 100, 4, 0, 10, -44, 15, 468, 7, 2024, 1998]
odd_index_number_sum = 0
i = 0 # index
for number in numbers:
    # division with remainder
    # if remainder is equal to zero, that means number is even
    if i % 2 == 0: 
        odd_index_number_sum += number

print("Calculated sum:")    # prints: Calculated sum:
print(odd_index_number_sum) # prints: 5022

Šį kodą galima modifikuoti ir supaprastinti su enumerate() funkcija:

.py
numbers=[-10, 50, 200, 200, 100, 4, 0, 10, -44, 15, 468, 7, 2024, 1998]
odd_index_number_sum = 0
for i, number in enumerate(numbers):
    # division with remainder
    # if remainder is equal to zero, that means number is even
    if i % 2 == 0: 
        odd_index_number_sum += number

print("Calculated sum:")    # prints: Calculated sum:
print(odd_index_number_sum) # prints: 5022

Kadangi kodas šiek tiek sudėtingesnis, pateikiama lentelė:

IteracijaIteracijos indeksasCiklo kintamasisOperacijaSuma
prieš ciklą---0
00-100 % 2 == 0 (True), -10 + 0-10
11501 % 2 != 0 (False)-10
222002 % 2 == 0 (True), 200 + -10190
332003 % 2 != 0 (False)190
441004 % 2 == 0 (True), 100 + 190290
5545 % 2 != 0 (False)290
6606 % 2 == 0 (True), 0 + 290290
77107 % 2 != 0 (False)290
88-448 % 2 == 0 (True), -44 + 290246
99159 % 2 != 0 (False)246
101046810 % 2 == 0 (True), 468 + 246714
1111711 % 2 != 0 (False)714
1212202412 % 2 == 0 (True), 2024 + 7142738
1313199813 % 2 != 0 (False)2738

Kodo pavyzdyje pateikiamas dalybos su liekana operatorius (angl. modulo) %. Šio operatoriaus rezultatas, liekanos reikšmė po dalybos. Žemiau pateikiama lentelė su įvairiais skaičiais ir operacijų su šiuo operatoriumi rezultatu:

ABA % BPaaiškinimas
103110 padalinta iš 3 yra 3 su liekana 1
204020 padalinta iš 4 yra 5 be liekanos
156315 padalinta iš 6 yra 2 su liekana 3
7527 padalinta iš 5 yra 1 su liekana 2
187418 padalinta iš 7 yra 2 su liekana 4
100100100 padalinta iš 10 yra 10 be liekanos
258125 padalinta iš 8 yra 3 su liekana 1
3310333 padalinta iš 10 yra 3 su liekana 3
4512945 padalinta iš 12 yra 3 su liekana 9

Paprasti pavyzdžiai

Skaičių suma ir vidurkis

Kartą jau skaičiavome skaičių sumą su sum() funkcija. Toliau pažiūrėsime, kaip tą padaryti su ciklu:

.py
grades=[3, 5, 3, 7, 7, 5, 9]
grades_sum = 0
for grade in grades:
    grades_sum = grades_sum + grade

print("Sum of grades:") # prints: Sum of grades:
print(grades_sum) # prints: 39

Kiekvienoje iteracijoje mes prie sumos pridedame pavienį pažymį ir taip, iki kol pažymių sąrašas baigiasi. Besikeičiančias reikšmes galite pamatyti žemiau lentelėje:

IteracijaPažymysSumaOperacija
prieš ciklą-0-
033=0 + 3
158=3 + 5
2311=8 + 3
3718=11 + 7
4725=18 + 7
5530=25 + 5
6939=30 + 9

Pridėjus dar vieną eilutę būtų galima nesunkiai gauti pažymių vidurkį:

.py
grades=[3, 5, 3, 7, 7, 5, 9]
grades_sum = 0
for grade in grades:
    grades_sum = grades_sum + grade

print("Grades average:") # prints: Grades average:
print(grades_sum/len(grades)) # prints: 5.571428571428571

Didžiausios reikšmės radimas

Įsivaizduokite dėžę, kurioje yra kortelės su užrašytais skaičiais. Dėžė nepermatoma. Su viena ranka galima laikyti tik vieną kortelę kortelę, su kita ištraukti tik vieną kortelę iš dėžės. Kaip, ištraukus visas korteles iš dėžės, vienoje rankoje laikyti kortelę su didžiausiu skaičiu?

Norint turėti didžiausią skaičių rankoje, reiktų traukti po vieną kortelę. Pirmąja kortelę pasilikti rankoje, tada traukti kitą kortelę ir palyginti, jeigu ištraukta kortelė didesnė už kitoje rankoje esančia, tai pasilikti, jeigu mažesnė - padėti šalin. Taip reiktų daryti, iki kol baigsis kortelės.

Tokiu pat būdu programavime randama didžiausia reikšmė:

.py
box=[0, -1, 100, 200, 5, 123, 0, 999, 12, 1410, 1998, 2024, 1, 2, 3]
biggest_number = box[0]
for number in box:
    if biggest_number < number:
        biggest_number = number

print("Biggest value in box:") # prints: Biggest value in box:
print(biggest_number) # 2024

Besikeičiančias reikšmes taip pat patogu pavaizduoti lentele:

IteracijaCiklo kintamojo reikšmėOperacijaDidžiausia Reikšmė
prieš ciklą--0
000 < 0 (False)0
1-10 < -1 (False)0
21000 < 100 (True)100
3200100 < 200 (True)200
45200 < 5 (False)200
5123200 < 123 (False)200
60200 < 0 (False)200
7999200 < 999 (True)999
812999 < 12 (False)999
91410999 < 1410 (True)1410
1019981410 < 1998 (True)1998
1120241998 < 2024 (True)2024
1212024 < 1 (False)2024
1322024 < 2 (False)2024
1432024 < 3 (False)2024

Kadangi programuotojai nemėgsta pasikartojančiai rašyti dažnai naudojamų algortimų, tai Python kalboje sukurta funkcija max(), su kuria galima pasilengvinti darbą:

.py
box=[0, -1, 100, 200, 5, 123, 0, 999, 12, 1410, 1998, 2024, 1, 2, 3]
biggest_number = max(box)

print("Biggest value in box:") # prints: Biggest value in box:
print(biggest_number) # 2024

Algoritmą pravartu žinoti, kadangi ne visais atvejais ateityje bus galima taip surasti didžiausią reikšmę!

Reikšmių kiekis sąraše

Įmonė savo darbuotojams užsako megztinius, kurių spalvas pasirenka patys. Mums reikia sužinoti, kiek konkrečiai yra vienos spalvos megztinių. Paieškokime, kiek buvo užsakyta žalių megztinių:

.py
sweaters_colors = [
    "red", "blue", "green", "yellow", "purple", "orange",
    "red", "blue", "green", "yellow",
    "purple", "orange", "red", "blue",
    "green", "yellow", "purple", "orange",
    "red", "blue"
]

color_to_count = "green"
count = 0 
for sweater_color in sweaters_colors:
    if sweater_color == color_to_count:
        count = count + 1

print("There are") # prints: There are
print(count) # prints: 3
print("green sweaters in the order") # prints: green sweaters in the order

Žemiau visos iteracijos ir besikeičiančios reikšmės pavaizduotos lentele:

IteracijaSpalvaOperacijaKiekis
prieš ciklą--0
0redred == green (False)0
1blueblue == green (False)0
2greengreen == green (True)1
3yellowyellow == green (False)1
4purplepurple == green (False)1
5orangeorange == green (False)1
6redred == green (False)1
7blueblue == green (False)1
8greengreen == green (True)2
9yellowyellow == green (False)2
10purplepurple == green (False)2
11orangeorange == green (False)2
12redred == green (False)2
13blueblue == green (False)2
14greengreen == green (True)3
15yellowyellow == green (False)3
16purplepurple == green (False)3
17orangeorange == green (False)3
18redred == green (False)3
19blueblue == green (False)3

Kaip ir maksimalios reikšmės radime, taip ir čia, galima panaudoti jau sukurtą metodą:

.py
sweaters_colors = [
    "red", "blue", "green", "yellow", "purple", "orange",
    "red", "blue", "green", "yellow",
    "purple", "orange", "red", "blue",
    "green", "yellow", "purple", "orange",
    "red", "blue"
]

color_to_count = "green"
count = sweaters_colors.count(color_to_count)

print("There are") # prints: There are
print(count) # prints: 3
print("green sweaters in the order") # prints: green sweaters in the order

Ciklas esant sąlygai (while)

Jeigu turėsime ne sąrašą, o kažkokią sąlygą, pagal kurią norėsimė vykdyti ciklą, tada naudosime ciklą while. Pavyzdžiui:

  1. Rodoma žinutė „kraunasi“, kol neatsiųstąs, neužkrautas socialinio tinklo įrašas (arba vaizdo įrašas);
  2. Neišjungiamas aplinkos apšvietimas kieme, kol laikas yra tarp 20:00 ir 06:00;
  3. Mikrobangų kronsnelė veikia, kol laikmatis rodo didesnį laiką negu 00:00;
  4. Žadintuvas skamba, kol nepaspaustas mygtukas „STOP“;
  5. ir kt.

Sintaksė ir veikimas turi panašumų į if. Sintaksei parodyti panaudosime time.sleep() funkciją, į kurią įrašę laiką sekundėmis, galėsime sustabdyti programos veikimą tam tikram laikui arba kitaip - įvykdžius tą eilutę, programa užmigs nurodytam laikui. Tarkime, turime imituokime mikrobangų krosnelės veikimą:

.py
import time

time_left = 10

while time_left>0:
    print("Your lunch is heating. Time left:", time_left)
    time.sleep(1) # Sleeps for 1 second
    time_left-=1

print("Your lunch is ready to eat!")

Pirmiausia importuojama biblioteką import time. Tada sukuriamas kintamasis, kuriame saugoma reikšmė, kuri nurodo, kiek liko laiko šildyti maistą. Su raktažodžiu while pradedamas ciklas, o po jo nurodoma sąlyga, šiuo atveju tai galima skaityti: ciklą vykdysime, kol liko daugiau negu 0 sekundžių. Cikle atspausdinama žinutė, tada palaukiama sekundę time.sleep(1) ir laikas sumažinamas vienetu time_left-=1. Pasibaigus ciklui (time_left pasiekus 0). Atspausdinama paskutinė žinutė. Toliau kiekviena iteracija pateikta lentele:

IteracijaLaikas prieš sąlygos tikrinimąSąlygos tikrinimasSąlygos rezultatasIšvesties žinutė
11010 > 0True"Your lunch is heating. Time left: 10"
299 > 0True"Your lunch is heating. Time left: 9"
388 > 0True"Your lunch is heating. Time left: 8"
477 > 0True"Your lunch is heating. Time left: 7"
566 > 0True"Your lunch is heating. Time left: 6"
655 > 0True"Your lunch is heating. Time left: 5"
744 > 0True"Your lunch is heating. Time left: 4"
833 > 0True"Your lunch is heating. Time left: 3"
922 > 0True"Your lunch is heating. Time left: 2"
1011 > 0True"Your lunch is heating. Time left: 1"
1100 > 0False"Your lunch is ready to eat!" (po ciklo)

Komanda break

Jeigu norėsime nutraukti ciklą, ankščiau laiko, galima pasinaudototi komanda break.

Tarkime turime temperatūras iš 10 skirtingų šaldytuvo sensorių/jutiklių(pagal ekalba, jutiklis - kokį nors fizinį poveikį jaučiantis ir apie tai elektriniu signalu pranešantis įtaisas). Maisto produktų pramonėje temperatūros palaikymas tam tikrame diapazone yra labai svarbus išlaikant produktus šviežius ir saugius vartoti. Žinoma, kad temperatūra turi būti tarp 0 ir 5 celsijaus laipsnių.

.py
# Simulated temperature readings from 10 refrigerators in a food storage facility.
# In real life, these readings would be taken from a database or obtained from sensors in real-time.
# It is possible to recreate sensor readings using microcontrollers like micro:bit, Arduino, or STM.
refrigerator_readings = [2, 4, 5, -1, 3, 7, 6, 8, 4, 3]
safe_min_temperature = 0
safe_max_temperature = 5

# Check for readings outside the safe temperature range
for reading in refrigerator_readings:
    # If the sensor temperature is outside the min and max values, the loop will break
    if reading < safe_min_temperature or reading > safe_max_temperature: 
        print(f"ALARM: Refrigerator reading {reading}°C is outside the safe range of {safe_min_temperature}°C to {safe_max_temperature}°C.")
        break
else:
    # This block executes if all readings are within the safe range
    print("All refrigerator readings are within the safe temperature range.")

# Output:
# ALARM: Refrigerator reading -1°C is outside the safe range of 0°C to 5°C.

Pavyzdiniame kode panaudota papildoma for ciklo sintaksė. Po tokio ciklo galima parašyti raktažodį else su po juo sekančiu dvitaškiu ir nurodyti komandas (reikia padaryti įtrauką nuo krašto), kurias norime įvykdyti, kai ciklui pasibaigus sėkmingai, t.y. įvykdžius visas sąrašo iteracijas. Tai šiuo atveju, jeigu visi jutiklių duomenys būtų geri (tarp 0 ir 5 celsijaus laipsnių), po ciklo būtų įvykdytos visos kodo eilutės po else. Tai galite pamatyti pakeitę pradinius duomenis į

.py
refrigerator_readings = [2, 4, 3, 3, 3, 2, 1, 2, 4, 3]

Raktažodžius break ir else taip pat galima naudoti ir su while ciklu.

Ciklo for keitimas ciklu while ir atvirkščiai

Abi sintaksės, tiek for ciklo, tiek while ciklo, skirtos aprašyti pasikartojančių operacijų vykdymą, tai todėl kai kuriais atvejais jas galima pakeisti viena kita.

Skaičių spausdinimas

Žemiau dviejuose pavyzdžiuose pateikta, kaip galima atspausdint skaičius nuo 0 iki 4 naudojantis abiejų tipų ciklus.

for

.py
# Print numbers from 0 to 4 using a for loop
for i in range(5):
    print(i)

while

Čia sukuriamas iteratorius i, o šis kiekvieno ciklo metu yra padidinamas vienetu, o ciklo sąlygoje tikrinama, ar sukurtas kintamasis mažesnis nei 5.

.py
# Print numbers from 0 to 4 using a while loop
i = 0
while i < 5:
    print(i)
    i += 1

Iteravimas per sąrašą

Žemiau dviejuose pavyzdžiuose pateikta, kaip galima atspausdint visą sąrašą naudojantis abiejų tipų ciklus.

for

.py
# Iterate over a list using a for loop
fruits = ["watermelon", "strawberry", "dragonfruit", "durian"]
for fruit in fruits:
    print(fruit)

while

Kaip ir praeitame pavyzdyje su while ciklu, taip ir čia - sukuriamas kintamasis, kuris tikrinamas. Tik šį kartą, tikrinama, ar šis mažesnis už sąrašo ilgį.

.py
# Iterate over a list using a while loop
fruits = ["watermelon", "strawberry", "dragonfruit", "durian"]
i = 0
while i < len(fruits):
    print(fruits[i])
    i += 1

Užduotys

1. Dalūs iš 7

1.1 Nuo 1 iki 100

Išveskite terminale visus skaičius nuo 1 (įskaitant) iki 100 (įskaitant), kurie dalijasi (be liekanos) iš 7.

1.2 Nuo a iki b

Sukurkite du kintamuosius a ir b. Atspausdinkite visus skaičius nuo a(įskaitant) iki b(įskaitant), kurie dalijasi iš 7. Kintamuosius a ir b sukurkite įvedant juos į terminalą.

2. Bakterijų populiacija

Bakterijų populiacija auga eksponentiškai. Pažymėkime, kad pradinė populiacija yra . Populiacija auga pastoviu greičiu . Dydis išreiškiamas augimu procentais per valandą (pvz. 5% augimas per valandą). Suskaičiuokite, kaip keičiais populiacijos dydis per valandų.

Paraškykite programą, kuri atspausdintų populiacijos dydį kas valandą, kai:

  • ;
  • ;
  • ;

Žinutės turi būti aiškios ir suprantamos:

text
Hour 0: Population = 100
Hour 1: Population = 105
Hour 2: Population = 110.25
Hour 3: Population = ...

3. Mažiausios reikšmės radimas

Sukurkite sarašą ir, naudodamiesi ciklu, suraskite mažiausią reikšmę.

Sukurtas kodas turi veikti taip pat, kaip ir min() funkcija (dokumentacija).

Pasitikrinimas #1

Duomenys:

.py
data=[10, 250, 190, 100, 200, 4500, 5600]

Tikėtina išvestis:

text
The minimum value of the list is 10

Pasitikrinimas #2

Duomenys:

.py
data=[100, 5, 3, 15, 18, 20, -1]

Tikėtina išvestis:

text
The minimum value of the list is -1

Pasitikrinimas #3

Duomenys:

.py
data=[2, 2, 2, 1, 2, 2, 1]

Tikėtina išvestis:

text
The minimum value of the list is 1

Pasitikrinimas #4

Duomenys:

.py
data=[]

Tikėtina išvestis:

text
There is no minimum value.

4. Mažiausios reikšmės vietos radimas

Pasinaudokite ankstesnės užduoties kodu, raskite mažiausios reikšmės vietą sąraše (indeksą). Papildykite arba perkurkitę ankstesnį kodą.

Pasitikrinimas #1

Duomenys:

.py
data=[10, 250, 190, 100, 200, 4500, 5600]

Tikėtina išvestis:

text
The minimum value is at index 0 in the list

Pasitikrinimas #2

Duomenys:

.py
data=[100, 5, 3, 15, 18, 20, -1]

Tikėtina išvestis:

text
The minimum value is at index 6 in the list

Pasitikrinimas #3

Duomenys:

.py
data=[2, 2, 2, 1, 2, 2, 1]

Tikėtina išvestis:

text
The minimum value is at index 3 in the list

arba

text
The minimum value is at index 6 in the list

Pasitikrinimas #4

Duomenys:

.py
data=[]

Tikėtina išvestis:

text
There is no minimum value.

5. Nelyginių ir lyginių skaičių suma

Sukurkite sąrašą su skaičiais. Suskaičiuokite nelyginių ir lyginių skaičių sumas atskirai. Atspausdinkite, kuri suma didesnė ir kokia ta suma.

Pasitikrinimas #1

Duomenys:

.py
numbers=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Tikėtina išvestis:

text
The sum of even numbers (30) is greater than the sum of odd numbers (25).

Pasitikrinimas #2

Duomenys:

.py
numbers=[1, 3, 5, 7, 9]

Tikėtina išvestis:

text
The sum of odd numbers (25) is greater than the sum of even numbers (“).

Pasitikrinimas #3

Duomenys:

.py
numbers=[2, 4, 6, 8, 10]

Tikėtina išvestis:

text
The sum of even numbers (30) is greater than the sum of odd numbers (0).

Pasitikrinimas #4

Duomenys:

.py
numbers=[]

Tikėtina išvestis:

text
The sums of even numbers and odd numbers are equal (0).

6. Ar seka yra aritmetinė progresija

Nustatykite, ar duota seka yra aritmetinė progresija. Jeigu seka yra aritmetinė progresija, nurodykite jos skirtumą.

Pasitikrinimas

AtvejisSekaIšvestis
1Sequence [2, 4, 6, 8, 10] is arithmetic progression (d=2)
2Sequence [10, 5, 0, -5, -10] is arithmetic progression (d=-5)
3Sequence [1, 2, 4, 7, 11] is not arithmetic progression
4Sequence [3, 3, 3, 3, 3] is arithmetic progression (d=0)
5*Sequence [7] is arithmetic progression (d=0)

*Seka su vienu nariu laikoma aritmetine progresija. Skirtumo reikšmę galima interpretuoti, kaip .

Apie aritmetinę progresiją

Pradėkime nuo žodžio „seka“. Tai aibė, kurioje elementai (skaičiai) yra užrašyti kažkokia tvarka. Pavyzdžiui: , , ir kt.

Aritmentinė progresija irgi yra skaičių seka, bet ji skiriasi nuo kitų sekų tuo, kad skirtumas tarp šalia esančių narių yra pastovus (vienodas). Tarkime turime 6 sekas, pasižiūrėkime skirtumus tarp narių ir pasižiūrėkime, kurios iš šių sekų yra aritmetinės progresijos, o kurios ne:

SekaSkirtumas 1Skirtumas 2Skirtumas 3Skirtumas 4Ar aritmetinės progresija
Taip
Taip
Ne
Taip
Ne
Taip

Nustant, ar seka yra aritmetinė progresija, reikia suskaičiuoti skirtumus tarp šalia esančių narių. Jeigu šie lygūs, tai seka yra aritmetinė progresija.

Šis pastovus aritmeninės progresijos skirtumas žymimas . Aritmetinės progresijos narys žymimas . Pavyzdžiui, pirmasis narys , antrasis , trečiasis , ..., n-tasis .

Apibrėžus žymėjimus, aritmetinės progresijos skirtumą galima aprašyti šitaip:
.

Matematiškai surasti n-tąjį narį galima pasinaudojus aritmetinės progresijos n-tojo nario formule: ;
Čia - aritmetinės progresijos nario numeris; - aritmetinės progresijos skirtumas; - pirmasis aritmetinės progresijos.

Žinant aritmetinės progresijos, kažkurį tai narį galima sužinoti sekantį (arba prieš jį esantį) tiesiog pridėjus skirtumą: . Pavyzdžiui, žinome, kad 55 aritmetinės progresijos narys yra lygus 100 (), o skirtumas lygus 23 (), tai

6. Aritmetinės progresijos n narių suma

Naudojantis ciklu, suskaičiuokite, kiek reikia sudėti aritmeninės progresijos narių, kad šių suma būtų didžiausia, bet mažesnė nei duotoji.

Galite šią užduotį pasitikrinti išsprendę matematiškai, susidarę nelygybę iš aritmetinės progresijos n narių sumos formulės.

Pasitikrinimas

Atvejisn-tojo nario formulėDidžiausia reikšmėElementų kiekis sumoje
15510
21508
8500020
9127550
11-10050
12-5020
13-50010
1450"Not Reachable"
151"Not Reachable"

7. Aritmetinės progresijos nario eilės numerio radimas

Suraskite didžiausią aritmetinės progresijos nario, kurio reikšmė mažesnė nei duotoji, eilės numerį. Šią užduotį padarykyte dviem būdais: su ciklu ir be.

Pasitikrinimas

AtvejisPirmasis narysSkirtumasRibaNario numeris
110-5-52
21010352
31251
4-100001000500014
55002501000037
60-100-1000099
7-100-50-10000197
8-5000100049
9123456789987654321145405
100100000100000000999
1150100
12505-1
13-50-5-754

8. Ilgiausias posekis ir aritmetinė progresija

Iš duotosios sekos suraskite ilgiausią iš eilės einančių narių posekį, kuris yra aritmetinė progresija. Šią seką turi sudaryti daugiau negu vienas narys. Nurodykite jos skirtumą. Neegzistuojant sekai išveskite žinutę, kad „seka nerasta“ (ar panašiai).

Paaiškinimas

Posekis - seka, gauta iš kitos sekos pašalinus kai kuriuos narius. Pavyzdžiui, turime baigtinę seką , iš jos galima sudaryti įvairius posekius , , , ir t.t.

Ieškokite tokių posekių, kuriose skaičiai eina iš eilės - vienas po kito. Nedarykite šuolių tarp skaičių ir sutelkite dėmesį tik į skaičius, kurie sąraše yra vienas šalia kito. Pavyzdžiui, iš sekos galima pamatyti padaryti daug posekių, iš iš eilės einančių skaičių: , , ir t.t. Bet ne visi posekiai yra aritmetinės progresijos.

Pagal apribojimus, iš sekos galima sudaryti tokias aritmetines progresijas:

  • ; ;
  • ; ;
  • ; ;
  • ; ;
  • ; ;
  • ; ;
  • ; ;
  • ; ;
  • ; ;
  • ;
  • ; ;
  • ; ;
  • ; ;
  • ; ;
  • ; ;
  • ; ;
  • ; .

Ilgiausias posekis iš šių yra , tai taip pat yra aritmetinė progresija, jos skirtumas lygus .

Pasitikrinimas

SunkumasPradinė sekaDidžiausias posekisSkirtumas
Kraštutiniai atvejai
Tuščia seka[][]-
Vienodi elementai[7, 7, 7, 7, 7][7, 7, 7, 7, 7]0
Pradinė seka ne aritmetinė[1, 3, 7, 8, 10, 15][7, 8]1
Slankiojo kablelio skaičiai (float)[1.1, 2.2, 3.3, 4.4, 5.5, 5.0, 4.5, 4.0][1.1, 2.2, 3.3, 4.4, 5.5]1.1
Praprasti atvejai
Vienas elementas[5][]-
Du elementai[3, 7][3, 7]4
Vidutinis
Paprasta AP[1, 2, 3, 4, 5][1, 2, 3, 4, 5]1
Kelios AP[1, 3, 5, 7, 9, 11, 2, 4, 6, 8][1, 3, 5, 7, 9, 11]2
Sunkiausias
Ne iš eilės einantys skaičiai[10, 7, 4, 1, -2, 0, 3, 6, 9][10, 7, 4, 1, -2]-3
Skirtingi skirtumai[5, 10, 15, 20, 18, 16, 14, 12, 10][18, 16, 14, 12, 10]-2
Mišrus atvejis[1.1, 2, 3.3, 4, 5.5, 6, 7.7, 8, 9.9, 10][2, 3.3, 4, 5.5, 6]1.1

*AP - aritmetinė progresija.

Sukurta
su meile

Kontaktai

2024 — Vilius P.