CS 61A Fall 2020 Homework02

HW_SOURCE_FILE=__file__


def num_eights(x):
    """Returns the number of times 8 appears as a digit of x.

    >>> 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', 'AugAssign'])
    True
    """
    "*** YOUR CODE HERE ***"
    if x < 10 :
        if x == 8: return 1
        else :return 0
    else:
        return num_eights(x//10) + num_eights(x%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', 'AugAssign'])
    True
    """
    "*** YOUR CODE HERE ***"
    '''
    #My idear
    def eight(n):
        if n <10 and n%10 != 8:
            return 0
        if n %10 == 8 : 
            return 1 
        else :return (eight(n//10))
    def func(x):
        i = 1
        num = 0
        flag =  0
        while i<=x : 
            if i % 8 ==0 or eight(i) :
                flag += 1
            if flag %2== 0 :
                num += 1
            else :
                num -= 1
            i+=1
        return flag
    if n <=8 :
        return n
    elif func(n-1)%2 == 0:
        return pingpong(n-1)+1
    else:
        return pingpong(n-1)-1
 '''
    def helper(res,cur,step):
        if cur == n:
            return res
        if cur % 8 ==0 or num_eights(cur)>0:
            return helper(res-step,cur +1 ,-step)
        else:
            return helper(res+step,cur+1,step)
    return helper(1,1,1)

def missing_digits(n):
    """Given a number a that is in sorted, increasing 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(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(19) # 2, 3, 4, 5, 6, 7, 8
    7
    >>> 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 ***"
    if n <10 :
        return 0
    else:
        if n%10 ==(n//10)%10 :
            return missing_digits(n//10)
        return missing_digits(n//10)+ n%10 - (n//10)%10 -1


def next_largest_coin(coin):
    """Return the next coin. 
    >>> next_largest_coin(1)
    5
    >>> next_largest_coin(5)
    10
    >>> next_largest_coin(10)
    25
    >>> next_largest_coin(2) # Other values return None
    """
    if coin == 1:
        return 5
    elif coin == 5:
        return 10
    elif coin == 10:
        return 25


def count_coins(total):
    """Return the number of ways to make change for total 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
    >>> from construct_check import check
    >>> # ban iteration
    >>> check(HW_SOURCE_FILE, 'count_coins', ['While', 'For'])                                          
    True
    """
    "*** YOUR CODE HERE ***"
    def dfs(total,current_coin):
        if total == 0 :
            return 1 
        elif total < 0 or current_coin ==None:
            return 0 
        with_cur = dfs(total - current_coin,current_coin)
        without_cur = dfs (total,next_largest_coin(current_coin))
        return with_cur + without_cur 
    return dfs(total,1)

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', 'AugAssign', 'FunctionDef', 'Recursion'])
    True
    """
    return (lambda f:lambda x: f(f,x))(lambda f,x:1 if x == 1 else  x*f(f,(x - 1))) #def形式的return可以写成这样:(lambda f : lambda x : f(f, x))(function)
    #return lambda n : (lambda x ,func : 1 if x == 1 else mul(x,func(x-1,)func)))(n , lambda x, func : 1 if x ==1 else mul(x,func(x-1,func)))
print(make_anonymous_factorial ()(5))

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值