Hailstone Function
Pascal
{ CMP203 PASCAL Hailstone Function
Ira Pohl last modified: April 8, 1998
This function is of interest to number theorists
and recursive function theorists. The outstanding
conjecture is that it terminates for
all positive integers.
}
program hailstone( input, output);
var i, max, len , mlen, mmax :integer;
function hail(n:integer; var large, length :integer): integer;
begin
if n = 1 then
hail := 1
else if odd(n) then
begin
hail := hail( 3*n +1, large , length);
length := length + 1;
if 3*n + 1 > large then large := 3*n +1;
end
else
begin
hail := hail( n div 2, large , length);
length := length + 1;
end
end;
begin
i := 1; max := i; len := 0; mmax := 0; mlen := 0;
while ( (i < 20000) and (hail ( i, max, len) = 1)) do
begin
if (mlen < len) then
begin
mlen := len;
writeln( i, max, len )
end;
if (mmax < max) then mmax := max;
i := i + 1;
max := i; len := 0
end;
writeln('maximums ', i, mmax, mlen )
end.
C
/*** HAILSTONE NUMBERS
BRIAN HAYES COMPUTER RECREATIONS
SCI AMER JAN 1984 pp10 - 16
***/
int count = 1;
hailstone(n)
int n;
{ ++count;
if (n == 1){
return ( 1 );
}
else if (n % 2 != 0)
return ( hailstone(3 * n + 1));
else
return ( hailstone( n / 2));
}
main()
{
int i;
for( i = 1; i < 10000; ++i){
count = 1;
hailstone( i );
}
printf("last hailstone number %d\n", i);
}
MODULA 2
(* CMP203 MODULA 2 Hailstone Function
Ira Pohl
Last Modified: April 8, 1998
Purpose: Compute the hailstone function.
*)
MODULE hail;
FROM io IMPORT input,output,readf,writef;
(* readf, writef are secretly scanf, printf
using file names input and output.
readf is a function and must so be used. *)
VAR i, max, len, mlen, mmax :INTEGER;
PROCEDURE hail(n:INTEGER; VAR large, length :INTEGER): INTEGER;
VAR h: INTEGER;
BEGIN
IF n = 1 THEN
h := 1
ELSIF ODD(n) THEN
h := hail(3*n +1, large , length);
length := length + 1;
IF 3*n + 1 > large THEN large := 3*n +1 END;
ELSE
h := hail(n div 2, large , length);
length := length + 1
END;
RETURN h
END hail;
BEGIN
i := 1; max := i; len := 0; mmax := 0; mlen :=0;
WHILE ( (i < 10000) AND (hail(i, max, len) = 1)) DO
IF mlen < len THEN
mlen := len;
writef(output,"\n%d %d %d",i, max, len )
END;
IF mmax < max THEN
mmax := max
END;
i := i + 1;
max := i; len := 0
END;
writef(output,"\n%d %d %d",i, mmax, mlen );
END hail.