Eksperymenty z sekwencją 3n+1

W tym ćwiczeniu pogłębimy naszą znajomość sekwencji 3n+1. Rozpoczniemy z kodem jak poniżej i będziemy go modyfikować. Jak na razie program wygląda następująco:




(seq3nlab1)

  1. Wyznacz liczbę iteracji (liczbę wykonań) pętli while.

    Nasz program obecnie wypisuje wartości sekwencji od początku, aż do chwili osiągnięcia 1. Jednym z ciekawych pytań jest: Ile liczb zawiera sekwencja kończąca się jedynką? Wyznaczenie tej wartości wymaga policzenia liczb w sekwencji.

Po pierwsze, zakomentuj (lub wykasuj) instrukcje print z programu. Następnie potrzebujemy lokalnej zmiennej, w której będziemy zapisywać wynik zliczania. Sensownie będzie ją nazwać count. Należy ją zainicjować wartością 0 przed rozpoczęciem wykonywania instrukcji w pętli. Po każdym wykonaniu pętli należy zwiększać wartość zmiennej count o 1 (inkrementować ją), tak abyśmy mogli śledzić liczbę iteracji pętli. Bardzo ważne jest aby umieścić instrukcję inkrementacji w odpowiednim miejscu. Zauważ, że położenie kasowanej instrukcji print może być w tym pomocne.

Gdy kończy się wykonywanie pętli (wartość sekwencji osiąga 1), wypisz wartość zmiennej count.

Program prezentuje realizację zestawu obliczeń (pattern of computation) nazywanych licznikiem (zauważ, że jest ona typem akumulatora). Zmienna count jest inicjalizowana wartością 0 i inkrementowana w każdym wykonaniu pętli. Po wyjściu z pętli zmienna count zawiera wynik będący liczbą wykonań pętli.

Aby po zakończeniu wykonywania funkcji seq3np1 wypisać na ekranie wynik jej działania, należy wywołać tą funkcję wewnątrz instrukcji print.

  1. Wywołuj funkcję seq3np1 zadając wartości wejściowe z pewnego zakresu, aż do osiągnięcia największej wartości z zakresu.

    W tym momencie dysponujemy funkcją wyznaczającą liczbę iteracji potrzebnych do osiągnięcia wartości 1 w sekwencji. Możemy ją wykorzystać do sprawdzenia długości sekwencji dla różnych wartości wejściowych. Dodatkowo, zamiast wywoływać funkcję dla jednej wartości na raz, możemy wywoływać funkcję iteracyjnie, w każdej iteracji zadając nową wartość startową.

    Utwórz pętlę for używając zmienną sterującą pętlą o nazwie start, która określa zakres wartości wejściowych funkcji od 1 do 50 co 1. Wywołaj funkcję seq3np1 wewnątrz pętli dla każdej wartości zmiennej start. Zmodyfikuj instrukcję print tak, aby wypisywać również wartość zmiennej start.

  2. Zastosuj moduł graficzny żółwia do wykreślenia liczby iteracji. Otrzymamy w ten sposób ciekawą wizualizację, która pozwoli ocenić względną liczbę iteracji dla wszystkich wartości startowych. Prawdopodobnie będziesz chciał wykorzystać metodę setworldcoordinates do odpowiedniego wyskalowania wykresu. Powinieneś również zastosować żółwia do zapisania na zewnątrz pętli wartości zmiennej oraz liczby iteracji, jeśli liczba iteracji jest większa od 100 (?).

  3. Wyznaczenie maksymalnej maksymalnej liczby iteracji.

    Przyjrzenie się wynikom z poprzedniego programu skłania nas do postawienia następującego pytania: Jak jest długość najdłuższej sekwencji? Najłatwiej uzyskać odpowiedź zapamiętując największą długość jaka wystąpiła do danej iteracji. Po każdym wyznaczeniu długości sekwencji sprawdzamy, czy jej długość jest większa od dotychczas największej. Jeśli jest większa, aktualizujemy zmienną, w której przechowywaliśmy wartość dotychczas największą i przechodzimy do nowej wartości startowej dla sekwencji. Na końcu, po zrealizowaniu wszystkich wartości startowych, największa dotąd wartość długości sekwencji staje się największą ze wszystkich.

    Utwórz zmienną o nazwie maxSoFar i zainicjalizuj ją wartością 0. Instukcja inicjalizująca powinna być umieszczona przed pętlą for, tak aby inicjalizacja była wykonana tylko raz. Teraz, wewnątrz pętli for zmień kod w taki sposób, aby zamiast wypisywać wartość funkcji seq3np1 na ekranie, zapisać ją w zmiennej, którą nazwij result. Wtedy możemy sprawdzać, czy zmienna result ma wartość większą niż zmienna maxSoFar. Jeśli tak, uaktualnij wartość zmiennej maxSoFar.

Eksperyment z różnymi wartościami startowymi.

Następna część - Wykreślanie funkcji sinusoidalnej