Berkeley cs61a hw1的完成和思考

hw1是很基础的内容。主要是按照要求编写4个函数。

(1)a_plus_abs_b(a, b) 

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_plus_abs_b(-1, 4)
    3
    >>> a_plus_abs_b(-1, -4)
    3
    """
    if b < 0:
        f = sub
    else:
        f = add
    return f(a, b)

他有个关键的要求就是最后返回的要是f(a,b)的形式。这就意味着f必须是一个函数而非一个变量。这是我第一次意识到还可以将一个函数赋给一个变量,使得变量变成了函数,最后也直接可以用f(a,b)的形式来表示。既可以表示add(a,b)函数,也可以表示sub(a,b)函数


(2)two_of_three(i, j, k)

def two_of_three(i, j, k):
    """Return m*m + n*n, where m and n are the two smallest members of the
    positive numbers i, j, and k.

    >>> 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
    """
    return min(i,j)**2+min(max(i,j),k)**2

要求函数中没有内容,所有的任务都要在最后return中反映出来。我们可以用的函数只有min()和max()这两个。要得到3个数中最小的2个,必须要一个一个来得到。在i,j,k中选出任意两个数,min(i,j)都会得到三个数中最小两个数的其中之一(记为a)。那么i和j中的另一个数我们就可以用max(i,j)来表示。接着我们用min(max(i,j),k),将除a外的剩下两个数进行比较,取最小的数。我觉得核心就是使用min和max对数字进行多轮两两比较。


(3)largest_factor(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=15" 
    b=0
    a=n-1 
    while b ==0 : 
      if n % a == 0 : 
         b=b+1 
         print(a)
      else:
          a=a-1

求一个数小于自己的最大因数。注意while 是条件循环,for是取值循环。并且此处从最大的数开始最简单。


(4)hailstone(n)

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
    >>> b = hailstone(1)
    1
    >>> b
    1
    """
    "*** YOUR CODE HERE ***"
    if n ==1 :
      print(n)
      return 1
    elif n > 1 :
        print(n)
        num=1
        while n > 1:
         if n % 2 ==0 : #even
          n = n // 2 #整除
          num=num+1
          print(n)
         else :
          n = n * 3 + 1
          num=num+1 
          print(n)
    return num 

他的要求是打印hailstone里的数并输出其长度。如果n为1,那么hailstone就为1,长度为1。如果n是奇数,那么乘3加1得到新的n。如果n是偶数,那么直接除以2得到新的n。我在实现的过程中发现缩进的错误和循环函数的错误使用都影响到了我的结果。并且在函数中print()和return是两个东西。只要你调用了函数就会得到print的结果,如a=hailstone(n)但a的值是hailstone()函数的返回值。这两者不能混淆。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值