cs61a 2021 fall hw03
阿新 • • 發佈:2022-03-18
網址 https://inst.eecs.berkeley.edu/~cs61a/fa21/hw/hw03/
problem1:用遞迴,一邊判斷當前的數字,一邊加上除了當前的數字判斷函式
peoblem2:這個函式的意思是從1到n,每一次加一,如果碰到數字中有8的數字或者可以整除數字8的則講加一改為每次減一,此次類推,下次則把減一改為加一。
problem3:這個函式是輸入一個數字n這個數字是非遞減排序的,然後輸出這個n第一個數字和最後一個數字之間所缺失的數字個數(可以重複)
problem4:這個類似動態規劃,兩種情況,一種是當前這種硬幣取,一種是當前的硬幣不取,取下一種硬幣,把兩種情況加起來。
problem5:哈諾塔經典問題了,遞迴的關鍵在於當作前面的問題已經全部解決,只要解決當前的問題就好了,這裡就是當作除了最後一個disk其他全部解決了,
之間將最後一個disk移過去,然後再一次新的遞迴。
problem6:因為需要用到遞迴,所以需要將自己作為引數傳過去,所以這個lambda需要兩個引數,第一個引數是自己,第二個引數是數字,
每一次數字都減一直到數字為一為止,如果不為一,則傳入自己和x-1.
HW_SOURCE_FILE = __file__ def num_eights(pos): """Returns the number of times 8 appears as a digit of pos. >>> num_eights(3) 0 >>> num_eights(8) 1 >>> num_eights(88888888) 8 >>> num_eights(2638) 1 >>> num_eights(86380) 2 >>> num_eights(12345) 0 >>> from construct_check import check >>> # ban all assignment statements >>> check(HW_SOURCE_FILE, 'num_eights', ... ['Assign', 'AnnAssign', 'AugAssign', 'NamedExpr']) True """ "*** YOUR CODE HERE ***" if pos == 8: return 1 elif pos != 8 and pos < 10: return 0 return num_eights(pos//10) + num_eights(pos%10) def pingpong(n): """Return the nth element of the ping-pong sequence. >>> pingpong(8) 8 >>> pingpong(10) 6 >>> pingpong(15) 1 >>> pingpong(21) -1 >>> pingpong(22) -2 >>> pingpong(30) -2 >>> pingpong(68) 0 >>> pingpong(69) -1 >>> pingpong(80) 0 >>> pingpong(81) 1 >>> pingpong(82) 0 >>> pingpong(100) -6 >>> from construct_check import check >>> # ban assignment statements >>> check(HW_SOURCE_FILE, 'pingpong', ... ['Assign', 'AnnAssign', 'AugAssign', 'NamedExpr']) True """ "*** YOUR CODE HERE ***" def func(flag,num,ans): if num == n: return ans if num_eights(num) != 0 or num % 8 == 0: return func(flag * -1, num + 1, ans + flag * -1) else : return func(flag, num + 1, ans + flag) return func(1,1,1) def missing_digits(n): """Given a number a that is in sorted, non-decreasing order, return the number of missing digits in n. A missing digit is a number between the first and last digit of a that is not in n. >>> missing_digits(1248) # 3, 5, 6, 7 4 >>> missing_digits(19) # 2, 3, 4, 5, 6, 7, 8 7 >>> missing_digits(1122) # No missing numbers 0 >>> missing_digits(123456) # No missing numbers 0 >>> missing_digits(3558) # 4, 6, 7 3 >>> missing_digits(35578) # 4, 6 2 >>> missing_digits(12456) # 3 1 >>> missing_digits(16789) # 2, 3, 4, 5 4 >>> missing_digits(4) # No missing numbers between 4 and 4 0 >>> from construct_check import check >>> # ban while or for loops >>> check(HW_SOURCE_FILE, 'missing_digits', ['While', 'For']) True """ "*** YOUR CODE HERE ***" def func(num, ans): if num // 10 == 0: return ans else : if num % 10 != num % 100 // 10: return func(int(num / 10),ans + ((num % 10 - 1) - (num % 100) // 10)) else: return func(int(num / 10),ans) return func(n,0) def ascending_coin(coin): """Returns the next ascending coin in order. >>> ascending_coin(1) 5 >>> ascending_coin(5) 10 >>> ascending_coin(10) 25 >>> ascending_coin(2) # Other values return None """ if coin == 1: return 5 elif coin == 5: return 10 elif coin == 10: return 25 def descending_coin(coin): """Returns the next descending coin in order. >>> descending_coin(25) 10 >>> descending_coin(10) 5 >>> descending_coin(5) 1 >>> descending_coin(2) # Other values return None """ if coin == 25: return 10 elif coin == 10: return 5 elif coin == 5: return 1 def count_coins(change): """Return the number of ways to make change using coins of value of 1, 5, 10, 25. >>> count_coins(15) 6 >>> count_coins(10) 4 >>> count_coins(20) 9 >>> count_coins(100) # How many ways to make change for a dollar? 242 >>> count_coins(200) 1463 >>> from construct_check import check >>> # ban iteration >>> check(HW_SOURCE_FILE, 'count_coins', ['While', 'For']) True """ "*** YOUR CODE HERE ***" def func(num_change, n): if num_change == 0: return 1 elif num_change < 0: return 0 elif n == None: return 0 else: with_max = func(num_change ,ascending_coin(n)) Notwith_max = func(num_change - n,n) return with_max + Notwith_max return func(change, 1) def print_move(origin, destination): """Print instructions to move a disk.""" print("Move the top disk from rod", origin, "to rod", destination) def move_stack(n, start, end): """Print the moves required to move n disks on the start pole to the end pole without violating the rules of Towers of Hanoi. n -- number of disks start -- a pole position, either 1, 2, or 3 end -- a pole position, either 1, 2, or 3 There are exactly three poles, and start and end must be different. Assume that the start pole has at least n disks of increasing size, and the end pole is either empty or has a top disk larger than the top n start disks. >>> move_stack(1, 1, 3) Move the top disk from rod 1 to rod 3 >>> move_stack(2, 1, 3) Move the top disk from rod 1 to rod 2 Move the top disk from rod 1 to rod 3 Move the top disk from rod 2 to rod 3 >>> move_stack(3, 1, 3) Move the top disk from rod 1 to rod 3 Move the top disk from rod 1 to rod 2 Move the top disk from rod 3 to rod 2 Move the top disk from rod 1 to rod 3 Move the top disk from rod 2 to rod 1 Move the top disk from rod 2 to rod 3 Move the top disk from rod 1 to rod 3 """ assert 1 <= start <= 3 and 1 <= end <= 3 and start != end, "Bad start/end" "*** YOUR CODE HERE ***" if n == 1: print_move(start, end) else: other = 6 - start - end move_stack(n - 1, start, other) move_stack(1, start, end) move_stack(n-1, other, end) from operator import sub, mul def make_anonymous_factorial(): """Return the value of an expression that computes factorial. >>> make_anonymous_factorial()(5) 120 >>> from construct_check import check >>> # ban any assignments or recursion >>> check(HW_SOURCE_FILE, 'make_anonymous_factorial', ... ['Assign', 'AnnAssign', 'AugAssign', 'NamedExpr', 'FunctionDef', 'Recursion']) True """ return (lambda f: f(f))(lambda f: lambda x: 1 if x == 0 else x * f(f)(x - 1))