פונקציות רקורסיביות
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-R של Coddy. שיעור 50 מתוך 64.
פונקציה רקורסיבית קוראת לעצמה עם גרסה קטנה יותר של הבעיה. היא זקוקה למקרה בסיס שמחזיר ערך בלי לקרוא לעצמו, אחרת היא לעולם לא תיעצר:
fact <- function(n) {
if (n <= 1) return(1)
n * fact(n - 1)
}
print(fact(5))פלט:
[1] 120כל קריאה ממתינה לסיום הקריאה הקטנה יותר: fact(3) מחשבת 3 * fact(2), שמחשבת 2 * fact(1), שמחזירה 1. כל שלב חייב להתקדם לעבר מקרה הבסיס:
count_down <- function(n) {
if (n == 0) {
cat("go\n")
return(invisible(NULL))
}
cat(n, "")
count_down(n - 1)
}
count_down(3)פלט:
3 2 1 goרקורסיה מתאימה לנתונים שמכילים עותקים קטנים יותר של עצמם, כמו רשימה שמכילה רשימות. הפונקציה הזו מחברת כל מספר, לא משנה כמה עמוק הוא מקונן:
deep_sum <- function(x) {
if (is.numeric(x)) return(sum(x))
total <- 0
for (item in x) total <- total + deep_sum(item)
total
}
print(deep_sum(list(1, list(2, 3), list(list(4)), 5)))פלט:
[1] 15קריאה רקורסיבית יכולה גם לחלק את הבעיה לשניים. חיפוש בינארי בודק את האיבר האמצעי בווקטור ממוין וממשיך בחצי שיכול להכיל את ערך היעד:
find <- function(v, target, lo = 1, hi = length(v)) {
if (lo > hi) return(NA)
mid <- (lo + hi) %/% 2
if (v[mid] == target) return(mid)
if (v[mid] < target) find(v, target, mid + 1, hi) else find(v, target, lo, mid - 1)
}
print(find(c(2, 5, 8, 12, 19), 12))
print(find(c(2, 5, 8, 12, 19), 7))פלט:
[1] 4
[1] NAאתגר
קלהשלם את count_digits(n) באופן רקורסיבי. למספר קטן מ־10 יש ספרה אחת; לכל מספר גדול יותר יש ספרה אחת יותר מאשר ל־n %/% 10. אל תמיר את המספר לטקסט.
הקוד שסופק קורא מספר שלם n (0 או יותר) ומדפיס את הערך שהוחזר.
נסו בעצמכם
count_digits <- function(n) {
# כתבו את הקוד שלכם כאן
0
}
# קוד קלט/פלט שסופק: השאירו אותו כפי שהוא
input <- suppressWarnings(readLines(file("stdin")))
cat(count_digits(as.numeric(input[1])), sep = "\n")
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1מחרוזות לעומק
תת־מחרוזות עם substr()עיצוב עם sprintf()פיצול וחיבורחיפוש במחרוזותהחלפת טקסטסיכום – בונה שמות משתמש4מטריצות
יצירת מטריצותאינדוקס מטריצותסיכומי שורות ועמודותאריתמטיקה של מטריצותסיכום – תרשים מקומות ישיבה10זרימת בקרה מתקדמת
הפונקציה switch()ifelse() וקטוריrepeat ו־breakפונקציות רקורסיביותסיכום – מסווג ציוניםתרגלו בעצמכם: קומפיילר R אונליין