cs61a 2021 fall hw03

网址 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))
posted @ 2022-03-18 20:41  天然气之子  阅读(623)  评论(0编辑  收藏  举报