30/09/2018, 18:46
Hỏi về đệ quy trong C, C++
Mình có đoạn code sau:
#include <stdio.h>
void func(int a){
if (a > 10) {
return -1;
}
func(a + 1);
printf("%d ", a);
}
int main(){
func(1);
return 0;
}
Mình không hiểu tại sao đoạn code trên lại in ra :
10 9 8 7 6 5 4 3 2 1
Mình nghĩ khi gọi đệ quy thì nó sẽ bỏ qua câu lệnh in ở dòng cuối và tiếp tục cho tới khi thoát ra.
Mọi người giải thích giúp mình với. Cảm ơn nhiều!
Bài liên quan
Bạn debug từng dòng lệnh là thấy nó hoạt động mà Nếu xài Visual Studio thì nhấn
F10 thì phải.
Một hàm chỉ thoát ra khi nó gặp câu lệnh return hoặc đã thực hiện xong tất cả các lệnh của hàm. Khi đến a=11, nó gặp lệnh return và thoát ra. Lúc này ở hàm func khi a=10, ở ngay sau vị gọi hàm của func(11), nó gọi lệnh in và thoát ra. Nó thoát ra đến hàm func của a = 9, tương tự như vậy.
Chắc mình nói hơi lung tung, bạn tìm hiểu cơ chế stack của việc gọi hàm là hiểu.
Có thể mình đã nghĩ sai về đệ quy. Trước tới giờ mình cứ nghĩ là gặp đệ quy thì nó sẽ thoát hẳn ra khỏi hàm nhưng không phải. Mình đã suy nghĩ lại về điểu này.
cái này liên quan đến hàng chờ trong c FILO bạn nên xem kĩ nó nhé.
Hay lam ban , hay giup nhieu nguoi hon nua
Bỏ sao mà bỏ. Nó chỉ tạm thời để đấy làm sau khi gọi đệ quy.
Có lẽ thớt hình dung không ra. Dạng này cũng vào hàng đơn giản nhất.
Ban đầu (cứ coi như) không có gì cả. Gọi func(1) thì nó hiện lên cửa sổ có số 1, gọi func(2) hiện lên cửa sổ có số 2 chồng lên… cho đến func(11) thì thôi. Giờ viết ra giấy xem có phải là 10 9 8… không nhé.
bạn có thể hình dung như này, các câu lệnh sau khi thực hiện func(1), printf(1) sẽ được đưa vào stack (xếp dưới cùng) rồi lại gọi đệ quy. kết quả là như sau:
printf(10)
printf(9)
…
printf(1)
stack sẽ lấy từ trên xuống (như khi bạn xếp gạch, xếp chồng lên nhau, khi lấy ra lại lấy từ trên xuống dưới).