01/10/2018, 11:03

Thắc mắc về chương trình đảo ngược nội dung chuỗi sử dụng đệ quy

chào mọi người, mình có một đoạn code đảo ngược “nội dung” chuỗi như thế này

#include <iostream>
#include <string>
#include <string.h>

using namespace std;

void dao(char *p)
{
   if(p!=NULL)
   {
       dao(strtok(NULL," "));
       cout << p << " ";
   }
}
int main()
{
  char a[] = "hello friend";
  char* p = strtok(a," ");
  dao(p);
}

code thì mình cũng hiểu được ở một phần là ở hàm strtok sẽ tách một đoạn trong chuỗi ra khi gặp dấu cách, nhưng còn ở phần đệ quy , nó hoạt động như thế nào ? , mình có chạy debug thử thì cũng hiểu một ít , đại khái là nó sẽ in ra từ friend trước rồi mới đến từ hello , nhưng mình vẫn chưa hiểu lắm về cách mà hàm gọi lại, mong các bạn giải thích giúp mình , thank you

rogp10 viết 13:12 ngày 01/10/2018

Chú ý behavior của strtok là không thể gọi nó trên một literal string, vì nó thay đổi C string, và thay đổi này tồn tại cho đến hết.

Nếu bạn đã đọc docs thì strtok trả về token hiện thời, lệnh strtok sẽ tiến tới token tiếp theo. Như vậy có thể hình dung bạn đi từ đầu một chuỗi xích. Đi đến đầu bên kia rồi bạn sẽ phải quay lại mới ra output và hoàn thành, vì vậy đây là cách đảo token.

Hoài Nam Trương viết 13:07 ngày 01/10/2018

hơi khó hiểu, bạn có thể giải thích rõ hơn chút được chứ ?

rogp10 viết 13:10 ngày 01/10/2018

Ẩn dụ sợi xích: Bạn đứng ở đầu này sợi xích, rồi đi thẳng một mạch đến đầu kia. Trên đường quay lại, bạn thấy trên mỗi mắt xích đều có viết chữ, bạn nhìn xuống và nhớ lại. Vậy có phải là bạn đã đọc ngược lại không?

Hoài Nam Trương viết 13:12 ngày 01/10/2018

ok bạn, mình đã hiểu được một phần rồi, mình sẽ tự nghiên cứu thêm, cảm ơn bạn.

rogp10 viết 13:08 ngày 01/10/2018

Mình viết lại rồi bạn đánh tick cho mình nhé.

Bài liên quan
0