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.