*Due by 5pm on Wednesday, 9/11*.

**Due date extended.** This homework was originally due Tuesday, 9/10. Due to
problems with the submission system, the deadline was extended a day.

**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.3,
1.4, and
1.5
of the Composing Programs online text.

**Welcome Survey.** Please complete our welcome survey. The survey is for the instructors to get to
know their students better, and your responses will be kept confidential to the
staff. The survey is also due by 5pm on Tuesday, 9/10.

**Q1.** 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)

**Q2.** 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:

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 ***"

**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 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 `with_if_statement` returns the number `1`, but `with_if_function`
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 ***"

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

- Pick a positive integer
`n`as the start. - If
`n`is even, divide it by 2. - If
`n`is odd, multiply it by 3 and add 1. - 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:

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 ***"

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