RosettaCodeData/Task/Hailstone-sequence/SAS/hailstone-sequence.sas

55 lines
1.4 KiB
SAS

* Create a routine to generate the hailstone sequence for one number;
%macro gen_seq(n);
data hailstone;
array hs_seq(100000);
n=&n;
do until (n=1);
seq_size + 1;
hs_seq(seq_size) = n;
if mod(n,2)=0 then n=n/2;
else n=(3*n)+1;
end;
seq_size + 1;
hs_seq(seq_size)=n;
call symputx('seq_length',seq_size);
run;
proc sql;
title "First and last elements of Hailstone Sequence for number &n";
select seq_size as sequence_length, hs_seq1, hs_seq2, hs_seq3, hs_seq4
%do i=&seq_length-3 %to &seq_length;
, hs_seq&i
%end;
from hailstone;
quit;
%mend;
* Use the routine to output the first and last four numbers in the sequence for 27;
%gen_seq(27);
* Show the number less than 100,000 which has the longest hailstone sequence, and what that length is ;
%macro longest_hailstone(start_num, end_num);
data hailstone_analysis;
do start=&start_num to &end_num;
n=start;
length_of_sequence=1;
do while (n>1);
length_of_sequence+1;
if mod(n,2)=0 then n=n/2;
else n=(3*n) + 1;
end;
output;
end;
run;
proc sort data=hailstone_analysis;
by descending length_of_sequence;
run;
proc print data=hailstone_analysis (obs=1) noobs;
title "Number from &start_num to &end_num with longest Hailstone sequence";
var start length_of_sequence;
run;
%mend;
%longest_hailstone(1,99999);