CSCI 3333.3 Data Structures
Spring 2013
Suggested Solution to Homework #5

Exercises:

(1) For example:

Algorithm NumberOnes(N: integer)
Input: N: non-negative integer
Output: Number of 1's in the binary implementation of N

if (N <= 1)
return N;
else
return (N % 2) + NumberOnes(N div 2);
end if;

(2) Assume that N = 2k.

(a) lgN +1 for N>= 1.
(b) 2N-1 for N>= 1.
(e) 4N2(1-(3/4)(k+1))

(3)

(a)
potfix: abc+d*ef-/g/+
pretfix: +a//*+bcd-efg

(b)
postfix: cd*ea+b-*fg-h-/i-
prefix: -/**cd-+eab--fghi

Program:

(1) For example, the algorithm:

Algorithm NumberOnes(N: integer)
Input: N: non-negative integer
Output: Number of 1's in the binary implementation of N

if (N <= 1)
    return N;
else
    return (N % 2) + NumberOnes(N div 2);
end if;

Program (1):

Algorithm Lucas(N: integer)
Input: an integer
Output: the Nth Lucas number

if (N == 0) return 2;
if (N == 1) return 1;
if (N < 0) return (-1) ^ (-N) * Lucas (-N);
return LucasHelper(N, 2, 1, 2);

Algorithm LucasHelper(N, i, Lim1, Lim2);
Input: N: an integer > 1.
       i: Lucas(i) to be computed.
       Lim1: Lucas(i-1)
       Lim2: Lucas(i-2)
Output: Lucas(N)

if N == i
    return Lim1 + Lim2;
else
    return LucasHelper(N, i+1, Lim1+Lim2, Lim1);
end if;

 

A suggested program in Perl:

use strict;

#    lucas.pl
#
#    Print the lucas number of an integer n
#    Usage: lucas.pl n
#     

#   Get num
@ARGV >= 1 || die "usage: lucas.pl n";
my $num = $ARGV[0];

print "Lucas(", $num, "): ", lucas($num), ".\n";
exit 0;

sub lucas {
    my $num = $_[0];
    if ($num == 0) { return 2; }
    if ($num == 1) { return 1; }
    if ($num < 0)  { return ((-1) ** (-$num)) * lucas(-$num); }
    return lucasHelper($num, 2, 1, 2);
}

sub lucasHelper {
    my ($num, $i, $lim1, $lim2) = @_;
    if ($num == $i) { return $lim1 + $lim2; }
    return lucasHelper($num, $i+1, $lim1 + $lim2, $lim1);
}