Sedang meninjau beberapa kode python yang terkait dengan panggilan rekursi dan memperhatikan pernyataan pengembalian tampak menarik. Bagaimana cara kerja rekursi ketika tidak ada penetapan variabel dalam pernyataan pengembalian untuk panggilan rekursif berikutnya?

Saat panggilan rekursif dilakukan, nilai penjumlahan antara tidak disimpan di tempat yang jelas. Debugger tampaknya menunjukkan daftar yang dikurangi satu setiap panggilan, tetapi saya tidak mengerti di mana nilai-nilai perantara disimpan.

Hal menarik lainnya adalah debugger tampaknya mengulangi satu kali terakhir melalui nilai-nilai setelah panggilan terakhir dilakukan. Menggunakan PyCharm, tetapi tidak yakin apakah itu penting.

Bagaimana pernyataan return menyimpan nilai penjumlahan selama panggilan rekursif dalam rekursi berikut?

def sum_list(list_of_num):
    if len(list_of_num) == 1:
        return list_of_num[0]
    else:
        return list_of_num[0] + sum_list(list_of_num[1:])

print(sum_list([4,6,7,3,7,3,2]))
2
Little Bamboo 19 Agustus 2017, 04:07

2 jawaban

Jawaban Terbaik

Fungsi mengembalikan nilai ke panggilan yang lebih tinggi di tumpukan panggilan, menurut Anda mengapa itu membutuhkan variabel, mis. lakukan panggilan rekursif sederhana:

def r(n):
    if n == 0:
         return 0
    return 1 + r(n-1)

Maka tumpukan panggilan akan terlihat seperti:

r(3):
    return 1 + r(2)
    r(2):
        return 1 + r(1)
        r(1):
            return 1 + r(0)
            r(0):
                return 0

Jadi, ketika Anda melepas tumpukan panggilan, Anda mendapatkan:

r(3):
    return 1 + r(2)
    r(2):
        return 1 + r(1)
        r(1):
            return 1 + 0
--
r(3):
    return 1 + r(2)
    r(2):
        return 1 + 1
--
r(3):
    return 1 + 2
--
3
6
AChampion 19 Agustus 2017, 01:14

Seperti yang dijelaskan oleh AChampion jika Anda ingin melihat jenis jejak tumpukan yang sama untuk kode Anda di Pycharm lakukan beberapa langkah .

Di Pycharm pilih

Show return values

Kemudian Anda dapat melihat saat men-debug setiap langkah bagaimana tumpukan panggilan ditambahkan dan setelah operasi selesai bagaimana nilai dikembalikan

Call stack return value

1
Hariom Singh 19 Agustus 2017, 01:31