Ing Python, ana watesan ndhuwur kanggo jumlah recursions (jumlah maksimum recursions). Kanggo nglakokaké fungsi rekursif karo nomer akeh telpon, iku perlu kanggo ngganti watesan. Gunakake fungsi ing modul sys perpustakaan standar.
Jumlah rekursi uga diwatesi kanthi ukuran tumpukan. Ing sawetara lingkungan, modul sumber saka perpustakaan standar bisa digunakake kanggo ngganti ukuran tumpukan maksimum (makarya ing Ubuntu, nanging ora ing Windows utawa mac).
Informasi ing ngisor iki diwenehake ing kene.
- Entuk wates ndhuwur jumlah rekursi saiki:
sys.getrecursionlimit()
- Ngganti watesan ndhuwur jumlah rekursi:
sys.setrecursionlimit()
- Ngganti ukuran maksimum tumpukan:
resource.setrlimit()
Kode sampel mlaku ing Ubuntu.
Entuk watesan rekursi saiki: sys.getrecursionlimit()
Watesan rekursi saiki bisa dipikolehi karo sys.getrecursionlimit ().
import sys
import resource
print(sys.getrecursionlimit())
# 1000
Ing conto, jumlah maksimum rekursi yaiku 1000, sing bisa beda-beda gumantung saka lingkungan sampeyan. Elinga yen sumber daya sing diimpor ing kene bakal digunakake mengko, nanging ora ing Windows.
Minangka conto, kita bakal nggunakake fungsi rekursif prasaja ing ngisor iki. Yen integer positif ditemtokake minangka argumen, nomer telpon bakal n kaping.
def recu_test(n):
if n == 1:
print('Finish')
return
recu_test(n - 1)
Kesalahan (RecursionError) bakal diunggahake yen sampeyan nyoba nindakake rekursi luwih saka watesan ndhuwur.
recu_test(950)
# Finish
# recu_test(1500)
# RecursionError: maximum recursion depth exceeded in comparison
Elinga yen nilai dijupuk dening sys.getrecursionlimit () ora strictly jumlah maksimum recursions, nanging ambane tumpukan maksimum interpreter Python, supaya malah yen nomer recursions rada kurang saka Nilai iki, kesalahan (RecursionError) bakal. diunggahake.
再帰限界は、再帰の限界ではなく、pythonインタープリタのスタックの最大。の最大。
python – Max recursion is not exactly what sys.getrecursionlimit() claims. How come? – Stack Overflow
# recu_test(995)
# RecursionError: maximum recursion depth exceeded while calling a Python object
Ngganti watesan rekursi: sys.setrecursionlimit()
Watesan ndhuwur nomer recursions bisa diganti dening sys.setrecursionlimit (). Watesan ndhuwur ditemtokake minangka argumen.
Ngidini rekursi sing luwih jero ditindakake.
sys.setrecursionlimit(2000)
print(sys.getrecursionlimit())
# 2000
recu_test(1500)
# Finish
Yen watesan ndhuwur sing ditemtokake cilik banget utawa gedhe banget, bakal ana kesalahan. Watesan iki (wates ndhuwur lan ngisor watesan dhewe) beda-beda gumantung ing lingkungan.
Nilai maksimum watesan gumantung ing platform. Yen sampeyan mbutuhake rekursi jero, sampeyan bisa nemtokake nilai sing luwih gedhe ing jangkoan sing didhukung dening platform, nanging elinga yen nilai iki bakal nyebabake kacilakan yen gedhe banget.
If the new limit is too low at the current recursion depth, a RecursionError exception is raised.
sys.setrecursionlimit() — System-specific parameters and functions — Python 3.10.0 Documentation
sys.setrecursionlimit(4)
print(sys.getrecursionlimit())
# 4
# sys.setrecursionlimit(3)
# RecursionError: cannot set the recursion limit to 3 at the recursion depth 1: the limit is too low
sys.setrecursionlimit(10 ** 9)
print(sys.getrecursionlimit())
# 1000000000
# sys.setrecursionlimit(10 ** 10)
# OverflowError: signed integer is greater than maximum
Jumlah maksimum recursions uga diwatesi dening ukuran tumpukan, minangka diterangno sabanjuré.
Ngganti ukuran maksimum tumpukan: resource.setrlimit()
Malah yen nilai gedhe disetel ing sys.setrecursionlimit (), bisa uga ora kaleksanan yen nomer recursions gedhe. Kesalahan segmentasi kedadeyan kaya ing ngisor iki.
sys.setrecursionlimit(10 ** 9)
print(sys.getrecursionlimit())
# 1000000000
recu_test(10 ** 4)
# Finish
# recu_test(10 ** 5)
# Segmentation fault
Ing Python, modul sumber daya ing perpustakaan standar bisa digunakake kanggo ngganti ukuran tumpukan maksimum. Nanging, modul sumber daya minangka modul khusus Unix lan ora bisa digunakake ing Windows.
- Unix Specific Services — Python 3.10.0 Documentation
- resource — Resource usage information — Python 3.10.0 Documentation
Kanthi resource.getrlimit (), sampeyan bisa njaluk watesan saka sumber kasebut ing bantahan minangka tuple saka (watesan alus, watesan hard). Kene, kita nemtokake resource.RLIMIT_STACK minangka sumber, kang nggantosi ukuran maksimum tumpukan telpon saka proses saiki.
- resource.getrlimit() — Resource usage information — Python 3.10.0 Documentation
- resource.RLIMIT_STACK — Resource usage information — Python 3.10.0 Documentation
print(resource.getrlimit(resource.RLIMIT_STACK))
# (8388608, -1)
Ing conto, watesan alus 8388608 (8388608 B = 8192 KB = 8 MB) lan watesan hard -1 (tanpa wates).
Sampeyan bisa ngganti watesan saka sumber karo resource.setrlimit (). Ing kene, watesan alus uga disetel menyang -1 (ora ana watesan). Sampeyan uga bisa nggunakake sumber pancet.RLIM_INFINIT kanggo makili watesan Unlimited.
Rekursi jero, sing ora bisa ditindakake amarga kesalahan segmentasi sadurunge owah-owahan ukuran tumpukan, saiki bisa ditindakake.
resource.setrlimit(resource.RLIMIT_STACK, (-1, -1))
print(resource.getrlimit(resource.RLIMIT_STACK))
# (-1, -1)
recu_test(10 ** 5)
# Finish
Ing kene, watesan alus disetel menyang -1 (ora ana watesan) kanggo eksperimen sing prasaja, nanging ing kasunyatan, bakal luwih aman kanggo mbatesi menyang nilai sing cocog.
Kajaba iku, nalika aku nyoba kanggo nyetel watesan alus Unlimited ing mac uga, ana kesalahan ing ngisor iki.ValueError: not allowed to raise maximum limit
Mbukak skrip nganggo sudo ora mbantu. Bisa uga diwatesi dening sistem.
Proses kanthi UID efektif saka superuser bisa njaluk watesan sing cukup, kalebu ora ana watesan.
Nanging, panjalukan sing ngluwihi watesan sing dileksanakake dening sistem isih bakal nyebabake ValueError.
resource.setrlimit() — Resource usage information — Python 3.10.0 Documentation
Windows ora duwe modul sumber daya, lan mac ora bisa ngganti ukuran tumpukan maksimum amarga watesan sistem. Yen bisa nambah ukuran tumpukan kanthi cara, kita kudu bisa ngatasi kesalahan pamisahan, nanging durung bisa ngonfirmasi.