Recursion · רקורסיה
A function that calls itself
- Recursion is when a function calls itself.
- Each call should work on a smaller version of the problem.
- Done right, the problem shrinks until it is trivial to solve.
פונקציה הקוראת לעצמה
- רקורסיה היא כאשר פונקציה קוראת לעצמה.
- כל שיחה צריכה לעבוד על גרסה קטנה יותר של הבעיה.
- כאשר ביצוע נכון, הבעיה מתכווצת עד שהיא קלה לפתרון.
Base case and recursive case
- The base case is the simplest case — it stops the recursion.
- The recursive case calls the function again on a smaller input.
- Without a base case the function never stops (an error).
מקרה בסיסי ומקרה רקורסיבי
- ה-מקרה הבסיסי הוא המקרה הפשוט ביותר — הוא מעצור את הרקורסיה.
- ה-מקרה הרקורסיבי קורא שוב לפונקציה עם כניסה קטנה יותר.
- ללא מקרה בסיסי, הפונקציה לעולם לא תיעצר (שגיאה).
def countdown(n):
if n == 0:
print("Go!")
return
print(n)
countdown(n - 1)
countdown(3)
A worked example: factorial
- The factorial
n!meansn × (n-1) × ... × 1. - In recursive form:
n! = n × (n-1)!, and the base case is0! = 1. - Each call multiplies
nby the factorial of one less.
דוגמה פותרת: פקטוריאלי
- הפקטוריאלי
n!שווה לn × (n-1) × ... × 1. - בצורה רקורסיבית:
n! = n × (n-1)!, והמקרה הבסיסי הוא0! = 1. - כל שיחה כופלת את
nבפקטוריאלי של אחד פחות.
def factorial(n):
if n == 0:
return 1
return n * factorial(n - 1)
print(factorial(4))
How the computer runs it
- Each call is paused on a call stack while it waits for the inner call.
- When the base case returns, the paused calls finish one by one.
- Too many calls overflow the stack — Python raises a
RecursionError.
איך המחשב מפעיל זאת
- כל שיחה מושבתת על שורת שיחות בזמן שהיא מחכה לשיחה הפנימית.
- כאשר המקרה הבסיסי מחזיר ערך, השיחות המושבתות מסתיימות אחת אחת.
- מספר רב מדי של שיחות גורם להצפה בשורה — Python משלחת שגיאת
RecursionError.
In Cambridge pseudocode
- A recursive function names its base case and recursive case clearly.
בפסאודוקוד קמברידג'
- פונקציה רקורסיבית מכנה במפורש את המקרה הבסיסי ואת המקרה הרקורסיבי שלה.
FUNCTION Factorial(n : INTEGER) RETURNS INTEGER
IF n = 0 THEN
RETURN 1 // base case
ELSE
RETURN n * Factorial(n - 1) // recursive case
ENDIF
ENDFUNCTION
Common mistakes
- Every recursion needs a base case, or it overflows the call stack.
- Each call must move closer to the base case.
טעויות נפוצות
- לכל רקורסיה יש צורך במקרה בסיסי, אחרת היא תגרום להצפה בשורת השיחות.
- כל שיחה חייבת לקרב למקרה הבסיסי.
Now you try
- Give each function a base case and a recursive case.
- Press Check answer to test your code.
כעת תנסו בעצמכם
- תן לכל פונקציה מקרה בסיסי ומקרה רקורסיבי.
- לחץ על בדוק תשובה כדי לבדוק את הקוד שלך.
Recursion returns from the leaves · רקורסיב חוזר מהעלים
Each call splits into smaller calls; answers return up from the base cases. · כל קריאה מתפצלת לקריאות קטנות יותר; התשובות חוזרות כלפי מעלה מהמקרים הבסיסיים.
Write a recursive sum_to(n) that returns 1 + 2 + ... + n. The base case is sum_to(0) which is 0. · כתוב פונקציה רקורסיבית sum_to(n) שהחזרתה היא 1 + 2 + ... + n. המקרה הבסיסי הוא sum_to(0) שהוא 0.
Click Run to see the output here. · לחץ על הרץ כדי לראות את התוצא כאן.
Write a recursive power(base, exp) that returns base raised to exp. The base case is exp == 0, which gives 1. · כתוב פונקציה רקורסיבית power(base, exp) שהחזרתה היא base מושוואה ל-exp. המקרה הבסיסי הוא exp == 0, שנותן 1.
Click Run to see the output here. · לחץ על הרץ כדי לראות את התוצא כאן.
Write a recursive count_up(n) that returns the list [1, 2, ..., n]. The base case is count_up(0) which is the empty list []. · כתוב פונקציה רקורסיבית count_up(n) שהחזרתה היא הרשימה [1, 2, ..., n]. המקרה הבסיסי הוא count_up(0) שהוא הרשימה הרוקה [].
Click Run to see the output here. · לחץ על הרץ כדי לראות את התוצא כאן.