User Tools

Site Tools


gibson:teaching:fall-2013:math445:lecture13

Math 445 lecture 13

Topics fprintf: formatted print function, and using fprintf in a factorial function.

% Some examples of fprintf usage. First set a few variables to be printed.
x = 3;
y = 7;


% fprintf substitutes the values of the listed variables into the
% format string in places marked with %'s. %d is code for decimal (integer).

fprintf('The values of x is %d and the value of y is %d\n', x, y);

The values of x is 3 and the value of y is 7


% If you want to print a number as a floating-point number, use %f or %e

fprintf('The values of x is %f and the value of y is %d\n', x, y);
The values of x is 3.000000 and the value of y is 7


% An example of fprintf with a string, using %s in the format string
% By the way, notice the \n in the examples. That's a newline character.

name = 'John';
fprintf('My name is %s\n', name);
My name is John

Now let's do a programming task: write a function that computes the factorial of n. The mathematical definition of the factorial is


n! = n(n-1)(n-2)(n-3) \ldots 3 \cdot 2 \cdot 1

To compute the factorial, we have to multiply the numbers n through 1 together. We can do that with a for-loop. Here's a basic implementation as a function in Matlab.

function p = fact(n);
% p = fact(n): compute factorial of n

  p = 1; % set p to 1
  
  for k=1:n  % loop over numbers 1 through n
    p = p*k; % multiply p by k and assign result into p
  end

end

Does it work? Let's check with some examples

fact(2)
ans =
     2  % correct

fact(3)
ans =
     6  % correct

fact1(4)
ans =
    24  % correct

fact(5)
ans =
   120  % correct

fact1(7)
ans =
  5040  % correct

Now let's add some fprintf statements to clarify how the function works. Print values of p, k, and p*k at each step in the loop. Also, let's change the loop order so that the multiplication proceeds from n to (n-1) to (n-2) down to 2 to 1, just to be closer to the familiar formula.

function p = fact(n);
% p = fact(n): compute factorial of n

  p = 1; % set p to 1

  for k=n:-1:1  % loop over numbers n through 1, in steps of -1

    fprintf('multiply %d by %d, product is %d\n', p, k, p*k);
    p = p*k;    

  end

end

Now you can see how the function operates

fact(7)
multiply 1 by 7, product is 7
multiply 7 by 6, product is 42
multiply 42 by 5, product is 210
multiply 210 by 4, product is 840
multiply 840 by 3, product is 2520
multiply 2520 by 2, product is 5040
multiply 5040 by 1, product is 5040
ans =  5040

You'll notice the first and last multiplications are unneccessary. We can eliminate them by starting p at value n, and changing the loop indices to start at n-1 and got down to 2.x

function p = fact(n);
% p = fact(n): compute factorial of n

  p = n; % set p to n

  for k=n-1:-1:2  % loop over numbers n-1 through 2, in steps of -1

    fprintf('multiply %d by %d, product is %d\n', p, k, p*k);
    p = p*k;    

  end

end

Now the function works with fewer multiplications

fact(7)
multiply 7 by 6, product is 42
multiply 42 by 5, product is 210
multiply 210 by 4, product is 840
multiply 840 by 3, product is 2520
multiply 2520 by 2, product is 5040
ans =  5040
gibson/teaching/fall-2013/math445/lecture13.txt · Last modified: 2013/10/16 18:56 by gibson