61A Homework 1

Due by Midnight on (that is, the end of) Wednesday, 1/25

This homework must be submitted online. See the instructions for submitting online for how to do this. Put all your answers to this homework in a file named <tt>hw1.py</tt>.

Readings. All problems in this homework can be solved with the subset of Python 3 introduced in sections 1.2-1.5 of the lecture notes.

Q1. Fill in the following function definition for adding a to the absolute value of b, without calling abs:

from operator import add, sub
def a_plus_abs_b(a, b):
    """Return a+abs(b), but without calling abs."""
    if ____:
        op = ____
    else:
        op = ____
    return op(a, b)

Q2. Write a function that takes three positive numbers and returns the sum of the squares of the two larger numbers. Use only a single expression for the body of the function:

def two_of_three(a, b, c):
    """Return x**2 + y**2, where x and y are the two largest of a, b, c."""
    return ____

Q3. Let's try to write a function that does the same thing as an if statement:

def if_function(condition, true_result, false_result):
    """Return true_result if condition is a true value, and false_result otherwise."""
    if condition:
        return true_result
    else:
        return false_result

This function actually doesn't do the same thing as an if statement in all cases. To prove this fact, write functions c, t, and f such that one of these functions returns the number 1, but the other does not:

def with_if_statement():
    if c():
        return t()
    else:
        return f()

def with_if_function():
    return if_function(c(), t(), f())

Q4. Douglas Hofstadter’s Pulitzer-prize-winning book, Gödel, Escher, Bach, poses the following mathematical puzzle.

  1. Pick a positive number n
  2. If n is even, divide it by 2.
  3. If n is odd, multipy it by 3 and add 1.
  4. Continue this process until n is 1.

The number n will travel up and down but eventually end at 1 (at least for all numbers that have ever been tried -- nobody has ever proved that the sequence will always terminate).

The sequence of values of n is often called a Hailstone sequence, because hailstones also travel up and down in the atmosphere before falling to earth. Write a function that takes a single argument with formal parameter name n, prints out the hailstone sequence starting at n, and returns the number of steps in the sequence:

def hailstone(n):
    """Print the hailstone sequence starting at n, returning its length."""

Hailstone sequences can get quite long! Try 27. What's the longest you can find?