61A Homework 1

Due by 11:59pm on Thursday, 6/27.

Submission. See the online submission instructions.

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

Course Survey. Please complete our online course survey. The survey is for the instructors to get to know their students better, and your responses will be kept confidential to everyone except the staff. Completing the survey will display a confirmation message. This confirmation message contains the answer to Q3.

Logistics questions

Q1. Read the Course Info page on the course website. Somewhere on that page, you will find out when Steven and Eric both took CS 61A. Fill in the blank with the year:

def stone_age():
    """Returns the year in which Steven and Eric took CS 61A."""
    return  _____

Q2. Login to Piazza and add CS 61A if it's not in your list of classes. Read the message titled "The answer to hw1 q2" and fill in the blank with Steven's favorite basketball player:

def favorite_player():
    """Returns Steven's favorite basketball player."""
    return  '_____'

Q3. Complete the course survey linked above and note the confirmation message. Then fill in the blank with Eric's favorite number:

def favorite_number():
    """Returns Eric's favorite number."""
    return  _____

Python questions

Q4. Recall that we can assign new names to existing functions. Fill in the blanks 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.

    >>> a_plus_abs_b(2, 3)
    5
    >>> a_plus_abs_b(2, -3)
    5
    """
    if b < 0:
        op = _____
    else:
        op = _____
    return op(a, b)

Q5. Write a function that takes three positive numbers and returns the sum of the squares of the two largest numbers. Use only a single expression for the body of the function (you may call built-in functions):

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

    >>> two_of_three(1, 2, 3)
    13
    >>> two_of_three(5, 3, 1)
    34
    >>> two_of_three(10, 2, 8)
    164
    >>> two_of_three(5, 5, 5)
    50
    """
    "*** YOUR CODE HERE ***"

Q6. 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 does not 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 the 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())

def c():
    "*** YOUR CODE HERE ***"

def t():
    "*** YOUR CODE HERE ***"

def f():
    "*** YOUR CODE HERE ***"

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

  1. Pick a positive integer n as the start.
  2. If n is even, divide it by 2.
  3. If n is odd, multiply 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 terminate). Analogously, hailstone travels up and down in the atmosphere before eventually landing on earth.

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.

Hailstone sequences can get quite long! Try 27. What's the longest you can find? Fill in your solution below:

def hailstone(n):
    """Print the hailstone sequence starting at n and return its length.

    >>> a = hailstone(10)  # Seven elements are 10, 5, 16, 8, 4, 2, 1
    10
    5
    16
    8
    4
    2
    1
    >>> a
    7
    """
    "*** YOUR CODE HERE ***"