الدوال التكرارية
جزء من قسم المنطق وتدفق التنفيذ في رحلة 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 (صفرًا أو أكثر) ويطبع القيمة المُعادة.
جرّب بنفسك
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الدوال التكراريةمراجعة - مُصنِّف الدرجات2استرجاع القيم باستخدام المفاتيح
البحث في المتجهات المُسمّاةالتحقق من المفاتيحإضافة المفاتيح وإزالتهاالتكرار عبر الأسماءمراجعة - مكتب الأسهمتدرّب بنفسك: مترجم R عبر الإنترنت