【Class 27】童心大发 通过递归函数 解决 python实践题目一

看到书中有个实践题目:童心大发,来玩玩:

4.10.1 逗号代码
假定有下面这样的列表:
spam = [‘apples’, ‘bananas’, ‘tofu’, ‘cats’]
编写一个函数,它以一个列表值作为参数,返回一个字符串。
该字符串包含所有表项,表项之间以逗号和空格分隔,并在最后一个表项之前插入 and。
例如,将前面的 spam 列表传递给函数,将返回’apples, bananas, tofu, and cats’。但你的函数应该能够处理传递给它的任何列表。

======》
这道题目如果用我们的for 等循环来实现,非常简单,那就没意思了

我们来增加一点难度,
要求:
1. 必须使用递归函数来实现
2. 可以实现正序或者逆序累加
3. 传入的列表不限制长度,并且 maybe 无限长的list。

想想应该如何实现呢? 是不是修改题目后变得有意思多了呢?

答案一

说实话,这道修改后的题目,确实是有点难度,刚开始我想到的方法如下:

import copy

str_ready=''

def str_add(arg , format=1):
    global str_ready

    # 倒序累加
    if format==1:
        if len(arg) == 1:
            str_ready += 'and '
            str_ready += arg[ len(arg)-1 ] 
        else:
            str_ready += arg[ len(arg)-1 ] 
            str_ready += ' , '
        print(str_ready)

        if len(arg) > 1:
            arg.remove(arg[ len(arg)-1 ])
            return str_add(arg, format)

        str_return=str_ready
        str_ready=''
        return str_return

    # 正序累加
    elif format==2:
        if len(arg) == 1:
            str_ready += 'and '
            str_ready += arg[ 0] 
        else:
            str_ready += arg[ 0 ] 
            str_ready += ' , '
        print(str_ready)

        if len(arg) > 1:
            arg.remove(arg[ 0 ])
            return str_add(arg, format)
        
        str_return=str_ready
        str_ready=''
        return str_return

b = ['a' , 'b', 'c', 'd', 'e']
c = str_add(b)
print('收到函数最终返回值: ', c)

b = ['a' , 'b', 'c', 'd', 'e']
c = str_add(b, format=2)
print('收到函数最终返回值: ', c)


b = ['a' , 'b', 'c', 'd', 'e', 'f', 'g' , 'h' , 'i']
c = str_add(b)
print('收到函数最终返回值: ', c)

运行 结果如下:

PS C:\Users\Administrator\Desktop\tmp> python .\Untitled-4.py
e ,
e , d ,
e , d , c ,
e , d , c , b ,
e , d , c , b , and a
收到函数最终返回值:  e , d , c , b , and a
a ,
a , b ,
a , b , c ,
a , b , c , d ,
a , b , c , d , and e
收到函数最终返回值:  a , b , c , d , and e
i ,
i , h ,
i , h , g ,
i , h , g , f ,
i , h , g , f , e ,
i , h , g , f , e , d ,
i , h , g , f , e , d , c ,
i , h , g , f , e , d , c , b ,
i , h , g , f , e , d , c , b , and a
收到函数最终返回值:  i , h , g , f , e , d , c , b , and a

答案二

说实话,上面 答案一 的方法,确实实现了要求,
但是,作为有强迫症的人,还是会有点不爽
前面代码中,通过[0] 和 [len() - 1 ] 的方法来实现正序,逆序是不是太low 了?
没点我大程序员的情趣!
不行,得改改!!!

在这里插入图片描述

结果如下:
使用三元表达式来判定正序还是倒序
index = 0 if format==True else (len(arg)-1)

import copy

str_ready=''

# format = True, 正序相加, 默认
# format = False, 倒序相加 
def str_add(arg , format=True):
    global str_ready
    index =  0 if format==True else (len(arg)-1)

    if len(arg) == 1:
        str_ready += 'and '
        str_ready += arg[ index ] 
    else:
        str_ready += arg[ index ] 
        str_ready += ' , '
    print(str_ready)

    if len(arg) > 1:
        arg.remove(arg[ index ])
        return str_add(arg, format)

    str_return=str_ready
    str_ready=''
    return str_return

b = ['a' , 'b', 'c', 'd', 'e', 'f', 'g' , 'h' , 'i']
c = str_add(b)
print('收到函数最终正序返回值: ', c)


b = ['a' , 'b', 'c', 'd', 'e', 'f', 'g' , 'h' , 'i']
c = str_add(b, format=False)
print('收到函数最终倒序返回值: ', c)

运行 结果如下:

PS C:\Users\Administrator\Desktop\tmp> python .\Untitled-4.py
a ,
a , b ,
a , b , c ,
a , b , c , d ,
a , b , c , d , e ,
a , b , c , d , e , f ,
a , b , c , d , e , f , g ,
a , b , c , d , e , f , g , h ,
a , b , c , d , e , f , g , h , and i
收到函数最终正序返回值:  a , b , c , d , e , f , g , h , and i
i ,
i , h ,
i , h , g ,
i , h , g , f ,
i , h , g , f , e ,
i , h , g , f , e , d ,
i , h , g , f , e , d , c ,
i , h , g , f , e , d , c , b ,
i , h , g , f , e , d , c , b , and a
收到函数最终倒序返回值:  i , h , g , f , e , d , c , b , and a
PS C:\Users\Administrator\Desktop\tmp>

答案三

秉承着我大程序员一贯打死不承认的作风,
仅仅用个 三元表达式 就想满足我
在这里插入图片描述
我黑人哥哥是这么容易满足的吗?????

扫描二维码关注公众号,回复: 5391775 查看本文章

不行,还得继续改改!!!

在这里插入图片描述

好吧,12点多了,得睡觉了,明天来更新吧,嘿嘿。
详细请看我下一篇博客
【Class 28】童心大发 通过递归函数 解决 python实践题目二 之 压缩代码
https://blog.csdn.net/Ciellee/article/details/88072071

猜你喜欢

转载自blog.csdn.net/Ciellee/article/details/88071002