01/10/2018, 14:53

Thuật toán lấy giá trị trước đó khi đã thực hiện xong hàm rồi

Nói hơi khó hiểu nhưng em cũng không biết cách nào để diễn giải dễ hiểu hơn nữa. vd
Em có 1 hàm

int[] val = {1,2,3,4};
XETTRUONGHOP(val);// val nhận 1 trong 4 giá trị 1,2,3,4

Bây giờ em phải viết hàm XETTRUONGHOP(int val); thế nao để khi ban đầu chạy hàm xét trường hợp lấy được giá trị val ở lần 1. Lần chạy hàm XETTRUONGHOP(int val) tiếp theo, cũng truyền vào biến val đó, nếu val giống lần đầu thì ta chạy hàm DIEUCHINH(val (giá trị val 2 lần giống nhau)). Nếu ở lần thứ 2, biến val truyền vào hàm XETTRUONGHOP() khác lần thứ nhất,thì ta chạy hàm DIEUCHINH(giá trị val lấy được ở lần chạyđầu tiên). Cứ như thế, nếu giống thì ta chạy hàm DIEUCHINH(với val của 2 lần giống nhau), nếu khác nhau thì ta chạy hàm DIEUCHINH(với giá trị val lấy được ở lần trước đó). Mọi người giúp em với. Em mất hơn 1 tiếng mà không nghĩ ra cho cái thuật toán này rồi.

明玉 viết 17:08 ngày 01/10/2018

Tại sao hàm XETTRUONGHOP của bạn nhận int val, nhưng bạn lại bỏ vào mảng val?

明玉 viết 17:02 ngày 01/10/2018

OK, mình giả sử int[] val = {1,2,3,4}; là các trường hợp có thể xảy ra của val (chẳng biết thật sự bạn muốn viết gì ở đây).

Bạn có thể tạo ra 1 hệ thống thông tin “stateful” (có tích lũy trạng thái), ở đây thì “hệ thống” là 1 function, “trạng thái” thì có thể dùng 1 biến nào đó để lưu giá trị val của lần cuối, ví dụ (javascript):

var last_val = null; // trạng thái
function XETTRUONGHOP(val) { // hệ thống
   console.log("Last value: ", last_val); // in ra giá trị của lần cuối
   console.log("New value: ", val); // in ra giá trị mà vừa mới được đưa vào function này
   last_val = val; // tích lũy trạng thái mới
}

Vậy là bạn có last_val là giá trị của lần cuối cùng, còn val là giá trị mới truyền vào, đủ điền kiện để làm theo đề bài của bạn, bạn cần thiết kế trạng thái khởi tạo (initial state) sao cho hàm của bạn biết được khi nào là lần đầu tiên nó được gọi (ví dụ cho last_val bằng null hoặc -1 để nhận biết điều đó):

console.log(val == last_val); // true or false
HelloWorld viết 17:09 ngày 01/10/2018

tạo 1 cái mảng, và 1 biến truy vết, tham chiếu hoặc tham biến biến truy vết với mảng vào hàm , ghi các giá trị nhận được sau khi chạy hàm đó, rồi truy vết lại theo vị trí của biến truy vết

viết 16:59 ngày 01/10/2018

khai báo 1 biến static là xong ~.~

void XETTRUONGHOP(int val)
{
    static int lastVal = 0;
    ...
    if (lastVal > 0)
    {
        DIEUCHINH(lastVal);
    }
    lastVal = val;
}
明玉 viết 17:08 ngày 01/10/2018

Viết ra thế thì gọi là dạy nhau làm rồi.

Trần Thiên Phúc viết 17:08 ngày 01/10/2018

Có gì khó đâu nhỉ
Tạo 1 biến static Map lưu số lần tương ứng với giá trị của lần đó. Khi nào cần thì get thôi còn nếu sợ chạy nhiều lần tốn bộ nhớ thì chỉ cần check điều kiện rồi xoá là được

Tao Không Ngu. viết 16:57 ngày 01/10/2018

Hi mai.

  1. Bạn có thể nói rõ tại sao phải làm vậy không ?
  2. Trong mọi trường hợp bạn đều chạy với gía trị cũ (nếu giống nhau thì mới = cũ, khác nhau thì chạy cũ). -> Kiểm tra xem biến cũ đã dược khởi tạo chưa -> nếu chưa gán bằng biến mới chạy hàm DC -> nếu rồi chạy DC với biến cũ rồi gán biến cũ bằng biến mới.
Bài liên quan
0