repeat ו־break
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-R של Coddy. שיעור 49 מתוך 64.
repeat מריצה את גוף הלולאה שוב ושוב, עד ש-break שבתוכה עוצרת את הלולאה. היא מתאימה ללולאה שתנאי היציאה שלה ידוע רק באמצע הגוף:
n <- 1
repeat {
n <- n * 2
if (n > 50) break
}
print(n)פלט:
[1] 64רצף קולץ הוא דוגמה: מחלקים את המספרים הזוגיים ב־2, הופכים את המספרים האי־זוגיים ל־3n + 1, ועוצרים ב־1. מספר הצעדים אינו ידוע מראש:
n <- 6
steps <- 0
repeat {
if (n == 1) break
n <- if (n %% 2 == 0) n / 2 else 3 * n + 1
steps <- steps + 1
}
print(steps)פלט:
[1] 8next מדלג על שארית האיטרציה הנוכחית ומתחיל את הבאה. הוא פועל בלולאות repeat, while ו־for:
for (x in 1:8) {
if (x %% 3 == 0) next
cat(x, "")
}
cat("\n")פלט:
1 2 4 5 7 8 לולאת repeat ללא break שניתן להגיע אליו לעולם לא מסתיימת. השתמשו במונה כמגבלת בטיחות כשהיציאה תלויה בנתונים:
total <- 0
tries <- 0
repeat {
tries <- tries + 1
total <- total + tries
if (total >= 20 || tries == 100) break
}
print(c(tries, total))פלט:
[1] 6 21אתגר
קלהשלימו את digital_root(n). החליפו את n בסכום הספרות שלו עד שנותרת ספרה אחת, והחזירו <result> after <steps> steps: עבור 9875 מתקבל 2 after 3 steps (9875, 29, 11, 2). למספר שכבר מורכב מספרה אחת נדרשים 0 צעדים.
sum(as.numeric(strsplit(as.character(n), "")[[1]])) מחברת את הספרות של n.
הקוד שסופק קורא את n ומדפיס את הערך שהוחזר.
נסו בעצמכם
digital_root <- function(n) {
# כתבו את הקוד שלכם כאן
""
}
# קוד הקלט/פלט שסופק: השאירו אותו כפי שהוא
input <- suppressWarnings(readLines(file("stdin")))
cat(digital_root(as.numeric(input[1])), sep = "\n")
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1מחרוזות לעומק
תת־מחרוזות עם substr()עיצוב עם sprintf()פיצול וחיבורחיפוש במחרוזותהחלפת טקסטסיכום – בונה שמות משתמש4מטריצות
יצירת מטריצותאינדוקס מטריצותסיכומי שורות ועמודותאריתמטיקה של מטריצותסיכום – תרשים מקומות ישיבה10זרימת בקרה מתקדמת
הפונקציה switch()ifelse() וקטוריrepeat ו־breakפונקציות רקורסיביותסיכום – מסווג ציוניםתרגלו בעצמכם: קומפיילר R אונליין