Bardzo prosta sztuczka, którą jednak warto znać, czyli zamiana dwóch zmiennych wartościami. Do dzieła.
Ok, tak to wygląda:
let a = 8;
let b = 3;
a = a + b;
b = a - b;
a = a - b;
console.log(a, b);
//3, 8
Pytanie, dlaczego to działa. Odpowiedź jest banalna – jak dodajesz do siebie dwie liczby a potem odejmiesz od sumy jedną to dostaniesz drugą, zaś gdy odejmiesz drugą, to dostaniesz pierwszą.
Większość ludzi widząc takie zapisy po prostu wzdryga się i nawet nie próbuje zrozumieć, w końcu oni w swoich językach tak się bawić nie muszą.
Czasami wystarczy jednak zapisać coś, ale inaczej ponazywać, żeby było jasne. Algorytm jest taki:
- Do a dodajemy b i mamy sumę (za to a niezamienione nam zniknęło)
- Mając sumę i b niezamienione możemy do b przypisać wartość a (11 – 3 = 8, które pod a jest)
- Mając b zamienione i posiadając sumę możemy w a odjąć od sumy b (11-8 = 3) ustawić tam a
Warto to sobie przeanalizować.
PS. Generalnie rozwiązywanie problemów algorytmicznych zawsze obejmuje następujące kroki:
- Określenie problemu
- Napisanie wywołań funkcji z argumentami i oczekiwanej wartości zwracanej
- Pobieżne nazwanie funkcji, wypełnienie jakąś prostą treścią (base case, edge case)
- Przelecenie na kartce (niekoniecznie schemat blokowy, nawet odradzam gdy nie wiemy co robimy) jak to ma działać
- Napisanie funkcji
- Testowanie funkcji i debugowanie na kartce, debugowanie w kodzie dopiero wtedy, gdy na kartce rozumiemy, ale kod dziwne działanie daje, jakiego na kartce nie było
Tak to wygląda. Nie ma żadnej ujmy, że nie potrafimy zrozumieć takiego czy innego kodu albo rozwiązać tego czy innego problemu z marszu, czy też patrząc na sam kod (albo go debugując) zrozumieć jak co działa.
Natomiast algorytmów uczymy się po to, aby poznać podejścia do rozwiązywania problemów:
- Ktoś, kto nigdy nie widział stosu nie wpadnie na pomysł użycia stosu
- Ktoś, kto nigdy nie widział dwóch wskaźników, 1 lewej, 2 z prawej, nigdy nie wpadnie na pomysł ich użycia
- Ktoś, kto nigdy nie widział szybkiego i wolnego wskaźnika również nie wpadnie, choćby nie wiem jak długo myślał, na to, by ich użyć
- Ktoś, kto nigdy nie robił binary search nigdy go nie użyje w jakimś problemie
Po to uczymy się takich z pozoru błahych a z pozoru nieproporcjonalnie trudnych do zadania (co to zamienić dwie zmienne wartościami bez trzeciej w językach wysokopoziomowych, które mają to w składnię wbudowane) podejść.
Jeżeli ktoś wkuje na pamięć ten wzór to nic z tego nie wyciągnie. Jeżeli przerobi sobie to na spokojnie to później będzie na podobne rozwiązania wpadać. Serio.