How to resolve the algorithm Hofstadter-Conway $10,000 sequence step by step in the Pascal programming language
How to resolve the algorithm Hofstadter-Conway $10,000 sequence step by step in the Pascal programming language
Table of Contents
Problem Statement
The definition of the sequence is colloquially described as: Note that indexing for the description above starts from alternately the left and right ends of the list and starts from an index of one. A less wordy description of the sequence is: The sequence begins: Interesting features of the sequence are that:
The sequence is so named because John Conway offered a prize of $10,000 to the first person who could find the first position, p in the sequence where It was later found that Hofstadter had also done prior work on the sequence. The 'prize' was won quite quickly by Dr. Colin L. Mallows who proved the properties of the sequence and allowed him to find the value of n (which is much smaller than the 3,173,375,556 quoted in the NYT article).
Let's start with the solution:
Step by Step solution about How to resolve the algorithm Hofstadter-Conway $10,000 sequence step by step in the Pascal programming language
Source code in the pascal programming language
program HofStadterConway;
const
Pot2 = 20;// tested with 30 -> 4 GB;
type
tfeld = array[0..1 shl Pot2] of LongWord;
tpFeld = ^tFeld;
tMaxPos = record
mpMax : double;
mpValue,
mpPos : longWord;
end;
tArrMaxPos = array[0..Pot2-1] of tMaxPos;
var
a : tpFeld;
MaxPos : tArrMaxPos;
procedure Init(a:tpFeld);
var
n,k: LongWord;
begin
a^[1]:= 1;
a^[2]:= 1;
//a[n] := a[a[n-1]]+a[n-a[n-1]];
//k := a[n-1]
k := a^[2];
For n := 3 to High(a^) do
Begin
k := a^[k]+a^[n-k];
a^[n] := k;
end;
end;
function GetMax(a:tpFeld;starts,ends:LongWord):tMaxPos;
var
posMax : LongWord;
r,
max : double;
Begin
posMax:= starts;
max := 0.0;
repeat
r := a^[starts]/ starts;
IF max < r then
Begin
max := r;
posMax := starts;
end;
inc(starts);
until starts >= ends;
with GetMax do
Begin
mpPos:= posMax;
mpValue := a^[posMax];
mpMax:= max;
end;
end;
procedure SearchMax(a:tpFeld);
var
ends,idx : LongWord;
begin
idx := 0;
ends := 2;
while ends <= High(a^) do
Begin
MaxPos[idx]:=GetMax(a,ends shr 1,ends);
ends := 2*ends;
inc(idx);
end;
end;
procedure OutputMax;
var
i : integer;
begin
For i := Low(MaxPos) to High(MaxPOs) do
with MaxPos[i] do
Begin
Write('Max between 2^',i:2,' and 2^',i+1:2);
writeln(mpMax:14:11,' at ',mpPos:9,' value :',mpValue:10);
end;
writeln;
end;
function SearchLastPos(a:tpFeld;limit: double):LongInt;
var
i,l : LongInt;
Begin
Limit := limit;
IF (Limit>1.0 ) OR (Limit < 0.5) then
Begin
SearchLastPos := -1;
EXIT;
end;
i := 0;
while (i<=High(MaxPos)) AND (MaxPos[i].mpMax > Limit) do
inc(i);
dec(i);
l := MaxPos[i].mpPos;
i := 1 shl (i+1);
while (l< i) AND (a^[i]/i < limit) do
dec(i);
SearchLastPos := i;
end;
var
p : Pointer;
l : double;
Begin
//using getmem because FPCs new is limited to 2^31-1 Byte for the test 2^30 )
getmem(p,SizeOf(tfeld));
a := p;
Init(a);
SearchMax(a);
outputMax;
l:= 0.55;
writeln('Mallows number with limit ',l:10:8,' at ',SearchLastPos(a,l));
freemem(p);
end.
You may also check:How to resolve the algorithm Loops/Increment loop index within loop body step by step in the Microsoft Small Basic programming language
You may also check:How to resolve the algorithm Colour bars/Display step by step in the Phix programming language
You may also check:How to resolve the algorithm Towers of Hanoi step by step in the Batch File programming language
You may also check:How to resolve the algorithm Sierpinski carpet step by step in the Action! programming language
You may also check:How to resolve the algorithm Five weekends step by step in the PowerShell programming language