[CS61A-Fall-2020]學習記錄一 Homework1 題解思路分享
前言
觀前提示,筆者寫的代碼答案放在github倉庫中,此處僅記錄過程與心得
正文
首先來看下hw的第一道題
Q2: A Plus Abs B
Fill in the blanks in the following function for adding a to the absolute value of b, without calling abs. You may not modify any of the provided code other than the two blanks.
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
>>> # a check that you didn't change the return statement!
>>> import inspect, re
>>> re.findall(r'^\s*(return .*)', inspect.getsource(a_plus_abs_b), re.M)
['return f(a, b)']
"""
if b < 0:
f = _____
else:
f = _____
return f(a, b)
題目大意,賦予f一個函數滿足在不使用abs函數的情況下,實現a+abs(b)的效果
解題過程,剛開始沒注意到是賦予函數,于是分別填了a - b和a + b的錯誤答案,看了報錯類型才反應過來,然后想起python可以函數賦予,于是將sub和add分別賦予f即可
Q3: Two of Three
Write a function that takes three positive numbers as arguments and returns the sum of the squares of the two smallest numbers. Use only a single line for the body of the function.
def two_of_three(x, y, z):
"""Return a*a + b*b, where a and b are the two smallest members of the
positive numbers x, y, and z.
>>> two_of_three(1, 2, 3)
5
>>> two_of_three(5, 3, 1)
10
>>> two_of_three(10, 2, 8)
68
>>> two_of_three(5, 5, 5)
50
>>> # check that your code consists of nothing but an expression (this docstring)
>>> # a return statement
>>> import inspect, ast
>>> [type(x).__name__ for x in ast.parse(inspect.getsource(two_of_three)).body[0].body]
['Expr', 'Return']
"""
return _____
題目大意,返回三個參數中最小兩個的平方和
解題過程,剛開始想了會如何在一行里選出三個參數中最小兩個,然后馬上想到全部一起平方加起來再減去最大的平方不就行了嗎
Q4: Largest Factor
Write a function that takes an integer n that is greater than 1 and returns the largest integer that is smaller than n and evenly divides n.
def largest_factor(n):
"""Return the largest factor of n that is smaller than n.
>>> largest_factor(15) # factors are 1, 3, 5
5
>>> largest_factor(80) # factors are 1, 2, 4, 5, 8, 10, 16, 20, 40
40
>>> largest_factor(13) # factor is 1 since 13 is prime
1
"""
"*** YOUR CODE HERE ***"
題目大意,找到比整數n小的最大的能整除n的數字
解題過程,直接循環,從1開始窮舉,可以對循環條件除2或取根號2來減少循環次數
Q5: If Function vs Statement
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_function(True, 2, 3)
2
>>> if_function(False, 2, 3)
3
>>> if_function(3==2, 3+2, 3-2)
1
>>> if_function(3>2, 3+2, 3-2)
5
"""
if condition:
return true_result
else:
return false_result
Despite the doctests above, this function actually does not do the same thing as an if statement in all cases. To prove this fact, write functions cond, true_func, and false_func such that with_if_statement prints the number 47, but with_if_function prints both 42 and 47.
def with_if_statement():
"""
>>> result = with_if_statement()
47
>>> print(result)
None
"""
if cond():
return true_func()
else:
return false_func()
def with_if_function():
"""
>>> result = with_if_function()
42
47
>>> print(result)
None
"""
return if_function(cond(), true_func(), false_func())
def cond():
"*** YOUR CODE HERE ***"
def true_func():
"*** YOUR CODE HERE ***"
def false_func():
"*** YOUR CODE HERE ***"
題目大意,通過編輯三個函數cond(),true_func(),false_func(),使得with_if_statement和with_if_fuction()產生預想的結果
解題過程,關鍵之關鍵在于了解到python中,將函數作為參數時,會先將函數運行,再將其結果作為參數返回,因此填上對應的數字,并調好條件cond就能成功解題
Q6: Hailstone
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, a hailstone travels up and down in the atmosphere before eventually landing on earth.
Breaking News (or at least the closest thing to that in math). There was a recent development in the hailstone conjecture last year that shows that almost all numbers will eventually get to 1 if you repeat this process. This isn't a complete proof but a major breakthrough.
This sequence of values of n is often called a Hailstone sequence. 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)
10
5
16
8
4
2
1
>>> a
7
"""
"*** YOUR CODE HERE ***"
題目大意,有一種數學規律(尚未完全證明),對一個正整數,若其為偶數,則除2,若其為奇數,則乘3并加1,重復上述步驟,此數定終為1。現有n,輸出n經上述規律到1的過程,并返回計算次數
解題過程,寫循環,循環條件是數為1,每次循環輸出該數,再設一個變量每次循環++即可
小結
雖然題目不難,但仍發現了自己一些問題,比如審題不清,有一定的原因是題目是英語而非中文,不過都要適應嘛

浙公網安備 33010602011771號