def fac(x):
if(x>1):
return fac(x-1)*x
else:
return 1
print(fac(6)) # ได้ 720
fac
ในที่นี้มีการเรียกตัวมันเองคือฟังก์ชัน fac
ซ้ำอีกภายในนั้น การเรียกซ้ำนี้จะเกิดขึ้นตราบใดที่ยังมากกว่า 1
แต่ถ้าเป็น 1
จะคืนค่า 1
โดยไม่มีการเรียกซ้ำ1
คือ fac(1)
else
ทันทีเพราะ x
เป็น 1
ดังนั้นจึงคืนค่า 1
กลับมา ซึ่งเป็นไปตามที่ควรจะเป็นfac(2)
x=2
จะเข้าเงื่อนไขแรก ซึ่งจะต้อง return fac(x-1)*x
ทำให้มีการเรียกใช้ฟังก์ชันนั้นซ้ำ แต่คราวนี้อาร์กิวเมนต์ต่างไปโดยลดลงไป 1
เป็น x-1
ก็คือเหลือ 1
1
กลับมา จากนั้นก็ถูกนำไปคูณกับ x
ก็คือ 2
ดังนั้นผลที่ได้ก็คือได้ 2
fac(3)
x=3
จะเข้าเงื่อนไขแรก เรียก return fac(x-1)*x
เมื่อแทนค่า x
จะได้เป็น return fac(2)*3
ซึ่ง fac(2)
ก็รู้ค่าแล้วจากกรณี x=2
ว่าเป็น 2
ดังนั้นเอามาคูณกันก็ได้ผลลัพธ์เป็น 6
x=4
ก็จะ return fac(3)*4
จึงได้ผลเป็น 24
x=5
ก็จะ return fac(4)*3
จึงได้ผลเป็น 120
x=6
ก็จะ return fac(5)*4
จึงได้ผลเป็น 720
x
ที่ใส่ลงไปx
ที่ต่ำลงไปทีละขั้น พอเรียกซ้ำก็จะเรียก x
ที่ต่ำลงไปเรื่อยๆจนในที่สุดก็เป็น 1
และไม่มีการเรียกซ้ำอีกdef fac(x):
f = 1 # ตั้งต้นที่ 1
for i in range(2,x+1): # ใช้ for วนซ้ำ ไล่ตั้งแต่ 2
f = f*i # คูณเพิ่มไปเรื่อยๆ
return f # คืนผลลัพธ์ที่ได้กลับไป
print(fac(6))
def fib(x):
if(x>2):
return fib(x-1)+fib(x-2)
else:
return 1
print(fib(8))
x
เป็นตัวที่ 1
หรือ 2
จะมีค่าเป็น 1
แต่ถ้าเป็นตัวถัดจากนั้นจะมีค่าเท่ากับสองตัวก่อนหน้าบวกกันdef fib(x):
a = 1
b = 1
f = 1
for i in range(3,x+1):
f = a+b
a = b
b = f
return f
print(fib(8))
fib(x)
จะมีการเรียก fib(x-1)
และ fib(x-2)
ขึ้นมาfib(x-1)
ก็จะทำการเรียก fib(x-2)
และ fib(x-3)
ส่วน fib(x-2)
ก็ไปเรียก fib(x-3)
กับ fib(x-4)
แล้วก็วนเรียกซ้ำเพิ่มไปเรื่อยๆ จำนวนครั้งที่เรียกมีแต่จะเพิ่มขึ้นเรื่อยๆเป็นทวีคูณfib(x-2)
จะถูกเรียกซ้ำ 2 ครั้ง fib(x-3)
ถูกเรียกซ้ำ 3 ครั้ง แต่มันก็ไม่ได้เก็บค่าเดิมเอาไว้ แต่กลับคำนวณใหม่แยกกันfor
วนซ้ำธรรมดา ตัวแปรมีการเก็บค่าเสร็จแล้วก็นำมาใช้แล้วล้างใหม่ทุกรอบ พอเป็นแบบนี้แล้วเครื่องจึงทำงานเบากว่ามาก[[['a','b'],['c','d']],[['e','f'],['g',['h','i']]],['j','k'],'l']
h
กับ i
นี้ซ้อนอยู่ในชั้นที่ ๔ คือเป็นลิสต์ในลิสต์ในลิสต์ในลิสต์['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l']
def yup(l):
y = [] # สร้างลิสต์เปล่าขึ้นมาก่อน
for c in l:
if(type(c)==list): # ตรวจชนิดของสมาชิกว่าเป็นลิสต์หรือเปล่า
y += yup(c) # ถ้าเป็นลิสต์ให้เรียกฟังก์ชันซ้ำเพื่อยุบก่อนค่อยเพิ่มเข้าไป
else:
y += [c] # ถ้าไม่ใช่ลิสต์ให้เพิ่มเข้าไปในสมาชิก
return y # คืนค่าลิสต์ที่ได้
lia = [[['a','b'],['c','d']],[['e','f'],['g',['h','i']]],['j','k'],'l']
print(yup(lia))
yup
มีการเรียกใช้ตัวมันเองในกรณีที่สมาชิกเป็นลิสต์ เพื่อให้ลิสต์นั้นยุบก่อนที่จะบวกเพิ่มเข้าไป ถ้าภายในลิสต์นั้นมีลิสต์อยู่อีกจึงทำการเรียกตัวเองซ้ำอีกfor
เฉยๆโดยไม่ทำเป็นฟังก์ชันเวียดเกิด เพราะเราไม่รู้ว่าจะต้องมีวังวนซ้อนอยู่กี่ชั้นติดตามอัปเดตของบล็อกได้ที่แฟนเพจ