Nasıl oluyor bu iş? Hanoi Çözüm garip Kuleleri
Hanoi kuleleri this sıradışı, yinelemeli çözüm keşfettim internette kayboldum:
for (int x=1; x < (1 << nDisks); x )
{
FromPole = (x&x-1)%3;
ToPole = ((x|x-1) 1)%3;
moveDisk(FromPole,ToPole);
}
This post cevaplar birinde benzer Delphi kodu var.
Ancak, beni hayat için, bu işleri neden iyi bir açıklama bulmak için görünmüyor olabilir.
Kimse bana bu anlamanıza yardımcı olabilir?
CEVAP
özyinelemeli çözüm kuleleri Hanoi çalıştığı istiyorsanız, hareket N disklerinden Bir tahta C, ilk hareket N-1-A, B, o zaman sizi en alttaki C, ve sonra hareket tekrar N-1 disk B C. özü
hanoi(from, to, spare, N):
hanoi(from, spare, to, N-1)
moveDisk(from, to)
hanoi(spare, to, from, N-1)
Açıkça hanoi( _ , _ , _ , 1) alır, hanoi ( _ , _ , _ , k) alır gibi birçok hamle olarak 2 * hanoi( _ , _ , _ , k-1) 1. Yani çözüm uzunluğu büyür dizisi 1, 3, 7, 15, ... Bu aynı sırası (1 << k) - 1, hangi açıklar uzunluğu döngü algoritması yayınlanmıştır.
Eğer bu çözümleri kendileri bakarsanız, N = 1 olsun
FROM TO
; hanoi(0, 2, 1, 1)
0 2 movedisk
N = 2 olsun
FROM TO
; hanoi(0, 2, 1, 2)
; hanoi(0, 1, 2, 1)
0 1 ; movedisk
0 2 ; movedisk
; hanoi(1, 2, 0, 1)
1 2 ; movedisk
Ve N = 3 olsun
FROM TO
; hanoi(0, 2, 1, 3)
; hanoi(0, 1, 2, 2)
; hanoi(0, 2, 1, 1)
0 2 ; movedisk
0 1 ; movedisk
; hanoi(2, 1, 0, 1)
2 1 ; movedisk
0 2 ; movedisk ***
; hanoi(1, 2, 0, 2)
; hanoi(1, 0, 2, 1)
1 0 ; movedisk
1 2 ; movedisk
; hanoi(0, 2, 1, 1)
0 2 ; movedisk
Çünkü özyinelemeli doğanın çözümü, ve sütunlar izleyin bir özyinelemeli mantık: eğer size orta giriş sütunları, parçaları yukarıda ve aşağıda kopya birbirlerinin, ama sayıları permuted. Bu peg sayı üzerinde herhangi bir aritmetik işlemi yok ama sadece onları permutes olan algoritma açık bir sonucu. Bu durumda N=4 orta satırda ise x=4 (üç yıldızdan ile işaretli).
Şimdi (X & (X-1)) X en az set bit ISE seçeneği, örneğin sayılar haritaları çok ifade bu gibi 1 7 form:
1 -> 0
2 -> 0
3 -> 2
4 -> 0 (***)
5 -> 4 % 3 = 1
6 -> 4 % 3 = 1
7 -> 6 % 3 = 0
Hile olduğunu çünkü orta sıra her zaman bir tam iki güç ve bu nedenle tam olarak bir bit, bir parçası sonra, orta sıra eşit kısmı daha önce eklediğinizde orta sıra değerini (4 Bu durumda) satır (yani 4=0 4, 6=2 6). Bunu uygulayan "kopya" özelliği, orta satır uygular ayrıca permütasyon bölümü. İfade (X | (X-1)) 1 beklendiği gibi benzer özelliklere sahiptir, bu yüzden onun için doğru olanları vardır, ve bunlar temizler, en düşük sıfır bitini ayarlar,:
1 -> 2
2 -> 4 % 3 = 1
3 -> 4 % 3 = 1
4 -> 8 (***) % 3 = 2
5 -> 6 % 3 = 0
6 -> 8 % 3 = 2
7 -> 8 % 3 = 2
Bu dizileri aslında doğru peg sayılar üretmek için neden, hadi sütun düşünün. Özyinelemeli çözüm ile başlar ve hanoi(0, 2, 1, N), O yüzden orta sıra (2 ** (N-1)) olmalı movedisk(0, 2). Şimdiye kadar yineleme kuralı, (2 ** (N-2)) sana ihtiyacımız var movedisk(0, 1) ve (2 ** (N-1)) 2 ** (N-2) movedisk (1, 2). Bu oluşturur "0,0,1" desen için mandal görülebilir farklı değişikliklerle yukarıdaki tabloda onay (satır 2, 4 ve 6 için 0,0,1 ve satır 1, 2, 3 0,0,2, satır 5, 6, 7 1,1,0, tüm permuted versiyonlar aynı desen).
Şimdi kendi kopyalarını oluşturmak için bu özelliği tüm fonksiyonları iki güç ama uzaklıklar ile çevresinde, yazarlar modül 3 üreten bu doğru permütasyon seçmiş. Bu üç tamsayı 0..2 sadece 6 farklı olasılık var, çünkü açıkça zor bir görev değil permütasyon algoritması mantıksal bir düzen içinde ilerleme. (X|(X-1)) 1 değil mutlaka derinden bağlantılı olan Hanoi sorun ya da değil ihtiyacı olan o kadar o var Kopyalama özelliği ve çözüm üretmek için doğru permütasyon doğru sipariş.
Ne kadar ciddi bu yeni ASP.NET güvenli...
Şelale grafikler, sorun/çözüm bulmak i...
&Quot;Visual Studio her zaman durdurma...
Tanımlamak için nasıl "türü bir ç...
Nasıl bir çözüm ikinci projeye NuGet p...