fourth_week_assignment

Recursion

阶乘

1、fac函数的第一个参数n作为计数使用;
2、每进行一次相乘,返回函数fac,第一个参数n-1,第二个参数传入实参factorial,代入下一次函数计数
3、设置递归边界条件 n == 1,返回factorial。

def fac(n,factorial=1):
    if n == 1:
        return factorial

    factorial *= n
    return fac(n-1,factorial)

猴子吃桃

** 1、n为天数,缺省值为第十天,剩余一个桃子;
2、桃子前一天的数量为2 * (peach_number + 1);
3、边界条件n == 1,递归9次,返回桃子数量。**

def peach(n=10,peach_number=1):
    if n == 1:
        return peach_number
    
    peach_number = 2 * (peach_number + 1)
    return peach(n-1,peach_number)

数字逆序放入列表中

1、整体思路:判断int,将int转为str,每次递归切片取最后一个字符串,追加到lst中。
2、易错点:a、lst需要设置缺省值空列表[],不能在函数内赋值,否则每次递归都会重新赋值成空列表。b、函数递归调用,第一个形参传参,是整除10,每进入一次,低位减一;c、缺省值为列表,复杂类型的默认作用域放在了int_reverse.__default__中,这个属性会伴随函数的整个声明周期,每次调用函数,列表里面的元素会不端增加,为了复用且不影响输出,返回值为清空缺省值列表
3、边界条件:当 num == 0时,说明num没有值可用,递归结束

def int_reverse(num,lst=[]):
    if not isinstance(num,int):
        return 'TypeError'
    
    if num == 0:
        print(lst)
        return lst.clear()
    
    num_str = str(num)
    lst.append(num_str[-1:])
    return int_reverse(num//10,lst)  

格式输出

1、整体思路:将接收的参数n,使用generator(节省内存空间),倒序依次打印数字并且转为字符串,使用’ '.join方法转为字符串num_str,使用切片依次取子串。上三角从尾部到头取子串,下三角从头部到尾部取子串。
2、易错点:a、步长step的确定:当i为1~9时,加空格长度位17,当i为10,加空格长度为20.故i为个位数步长2,两位数步长3,阈值为i为10。b、每次切片取完子串,start加一次步长,解决a的难点;c、循环8次,步长为16,start=-1-16,符合边界条件,故2 if i < 8 else 3。d、下三角的步长边界,num - i 为当前取值的位数,两位步长为3,一位步长为2.
3、尝试使用递归。

上三角

def format_out (num):
    if not isinstance(num,int):
        return "TypeError"
    num_str = ' '.join((str(i) for i in range(num,0,-1)))
    start = -1 # 切片范围起始位-1
    length = len(num_str)
    
    for i in range(num):
        print(num_str[start:].rjust(length))
        step = 2 if i < 8 else 3   # i < 8,每次两步,i > 8,每次三步
        start -= step    # 堆切片起始位置

下三角

def format_out1 (num):
    if not isinstance(num,int):
        return "TypeError"
    num_str = ' '.join((str(i) for i in range(num,0,-1)))
    start = 0
    step = 3  
    length = len(num_str)
    
    for i in range(num):
        print(num_str[start:].rjust(length))
        step = 3 if num - i > 10 else 2 # num - i 求当前数值,与10进行比较
        start += step

字典扁平化

1、整体思路:使用递归,循环字典,获得k,v,如果v不为dict,则进入返回target的kv对;如果v为dict,则进入递归,且key = key + k,得到’a’。使用’.’.join(key+k)连结,得到’a.b’作为key,非dict的value作为值。
2、易错点:a、如果将’a.c’,'a.c’连结作为key,key的实参,不能在函数条件语句中key = key + k。b、边界条件,关键点在于传入key的实参。

def flatten(n={'c':9,'a':{'b':1,'c':2},'d':{'e':3,'f':{'g':4}}},key='',target={}):
    for k,v in n.items():  # 函数语句中不能key += k,会将k全部连起来
        if isinstance(v,dict):
            flatten(v,key=key+k)   # 此处不能使用return语言,函数终止运行,不会再迭代后面的元素;
                                   # 此处不能使用key += k,语法错误
                                   # 不能单独使用k,会导致字典的最后一个元素'd.f.g':4变为'f.g':4
        else:
            target.setdefault('.'.join(key+k),v)    # 将字典的key连结起来的关键点
    return target
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值