鱼C论坛

 找回密码
 立即注册
查看: 2632|回复: 34

[技术交流] Python:每日一题 196

[复制链接]
发表于 2018-8-10 10:46:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 冬雪雪冬 于 2018-8-12 12:33 编辑

我们的玩法做了一下改变:

1. 楼主不再提供答案。
2. 请大家先独立思考,再参考其他鱼油的解答,这样才有助于自己编程水平的提高。开始阶段是看不到其他人的回帖的,等答题完成,开始评分时再取消限制。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。

题目:
帕斯卡三角形(杨辉三角)大家都很熟悉。即每新的一行的每个数等于它上方两数之和,并在左右两端各增加一个1
1.jpg
我们很容易编写一个函数实现,如:
  1. >>> tri(10)
  2. 1
  3. 1, 1
  4. 1, 2, 1
  5. 1, 3, 3, 1
  6. 1, 4, 6, 4, 1
  7. 1, 5, 10, 10, 5, 1
  8. 1, 6, 15, 20, 15, 6, 1
  9. 1, 7, 21, 35, 35, 21, 7, 1
  10. 1, 8, 28, 56, 70, 56, 28, 8, 1
  11. 1, 9, 36, 84, 126, 126, 84, 36, 9, 1
复制代码

这里把规则稍做改变,两端各自增加的不是1,而是上一行最大的数,即得到这样的结果:
  1. >>> tri(10)
  2. 1
  3. 1, 1
  4. 1, 2, 1
  5. 2, 3, 3, 2
  6. 3, 5, 6, 5, 3
  7. 6, 8, 11, 11, 8, 6
  8. 11, 14, 19, 22, 19, 14, 11
  9. 22, 25, 33, 41, 41, 33, 25, 22
  10. 41, 47, 58, 74, 82, 74, 58, 47, 41
  11. 82, 88, 105, 132, 156, 156, 132, 105, 88, 82
复制代码

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-10 11:13:44 | 显示全部楼层
本帖最后由 塔利班 于 2018-8-10 11:23 编辑
  1. def fun196(x):
  2.     L=[1]
  3.     print(1)
  4.     for i in range(2,x+1):
  5.         a=max(L)
  6.         b=[L[k]+L[k+1] for k in range(i-2)]
  7.         L=[a]+b+[a]
  8.         print(str(L).strip('[]'))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-10 11:20:02 | 显示全部楼层
本帖最后由 凌九霄 于 2018-8-10 12:17 编辑
  1. def triangles():
  2.     N = [ 1 ]
  3.     while True:
  4.         yield N
  5.         N.append(0)
  6.         N = [ N[ i - 1 ] + N[ i ] for i in range(len(N)) ]

  7. n = 0
  8. maxv = 1

  9. for i in triangles():
  10.     i[ 0 ], i[ len(i) - 1 ] = maxv, maxv
  11.     print(i)
  12.     maxv = max(i)
  13.     n = n + 1
  14.     if n == 10:
  15.         break
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-10 11:36:08 | 显示全部楼层
  1. def tri(n):
  2.     print('1\n1, 1')
  3.     a = [1, 1]
  4.     for i in range(1, n-1):
  5.         b =[max(a)]+ [a[i]+a[i+1] for i in range(len(a)-1)] +[max(a)]
  6.         print(', '.join([str(i) for i in b]))
  7.         a = b

  8. tri(10)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-10 12:54:07 | 显示全部楼层
  1. def tri(n):
  2.     result = []
  3.     for i in range(n):
  4.         temp = []
  5.         if i == 0:
  6.             result.append([1])
  7.         elif i == 1:
  8.             result.append([1,1])
  9.         else:
  10.             for j in range(i+1):
  11.                 if j == 0 or j == i:
  12.                     temp.append(max(result[i-1]))
  13.                 else:
  14.                     temp.append(result[i-1][j-1]+result[i-1][j])
  15.             result.append(temp)
  16.     #逐行打印
  17.     for each in result:
  18.         for index in range(len(each)):
  19.             if index != len(each) - 1:
  20.                 print(each[index],end = ', ')
  21.             else:
  22.                 print(each[index])
复制代码

  1. >>> tri(10)
  2. 1
  3. 1, 1
  4. 1, 2, 1
  5. 2, 3, 3, 2
  6. 3, 5, 6, 5, 3
  7. 6, 8, 11, 11, 8, 6
  8. 11, 14, 19, 22, 19, 14, 11
  9. 22, 25, 33, 41, 41, 33, 25, 22
  10. 41, 47, 58, 74, 82, 74, 58, 47, 41
  11. 82, 88, 105, 132, 156, 156, 132, 105, 88, 82
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-10 13:00:41 | 显示全部楼层
本帖最后由 archlzy 于 2018-8-10 14:05 编辑
  1. def tri(num):
  2.     def temp_tri(num):
  3.         if num == 1:
  4.             return [1]
  5.         temp_list = temp_tri(num-1)
  6.         temp_list.append(0)
  7.         temp_list = [temp_list[i-1] + temp_list[i] for i in range(len(temp_list))]
  8.         temp_list[0] = temp_list[len(temp_list)-1] = max(temp_tri(num-1))
  9.         return temp_list
  10.     for i in range(num):
  11.         print(str(temp_tri(i+1)).strip("[]"))
复制代码


评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-10 13:06:03 | 显示全部楼层
  1. def triangle(num0):
  2.     if num0 < 1:
  3.         return 0
  4.     list1 = [1]
  5.     list2 = []
  6.     print(list1)
  7.     if num0 == 1:
  8.         return 0
  9.     for i in range(num0-1):
  10.         list2.append(max(list1))
  11.         if i > 0:
  12.             for j in range(i):
  13.                 if j != i:
  14.                     list2.append(list1[j] + list1[j + 1])
  15.         list2.append(max(list1))
  16.         print(list2)
  17.         list1 = list2
  18.         list2 = []

  19. triangle(10)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-10 14:03:32 | 显示全部楼层
  1. def fun(num):
  2.     a=''
  3.     nums1=[]
  4.     nums2=[1,1]
  5.     for i in range(1,num+1):
  6.         for ii in range(i):
  7.             if ii==0 or ii==i-1:
  8.                 nums1.append(max(nums2))
  9.             else:
  10.                 nums1.append(nums2[ii]+nums2[ii-1])
  11.       
  12.         for each in nums1:
  13.             a+=str(each)+' '   
  14.         print(a)
  15.         nums2=nums1
  16.         nums1=[]
  17.         a=''
  18.    
  19. fun(10)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-10 16:03:13 | 显示全部楼层
def tri(num):
    list1=[1]
    n=0
    while True:
        tmp=''
        for i in range(len(list1)):
            if i==len(list1)-1:
                tmp+=str(list1[i])
            else:
                tmp+=str(list1[i])+','
        print(tmp)
        n=n+1
        if n==num:
            break
        list2=list1[:]
        list1=[((list1+[0])[i]+([0]+list1)[i])for i in range(len(list1)+1)]
        tmp1=max(list2)
        list1[0]=tmp1
        list1[-1]=tmp1

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-10 16:08:33 | 显示全部楼层
本帖最后由 天圆突破 于 2018-8-10 16:09 编辑
  1. def func196(n=0):
  2.     result, lst, j  = [], [1], 1
  3.     while True:
  4.         result.append(lst)
  5.         print(lst)
  6.         if j == n:break
  7.         j += 1
  8.         lst = [None for i in range(len(result)+1)]
  9.         lst[0] = lst[-1] = max(result[-1])
  10.         if len(lst) > 2:
  11.             for i in range(len(result[-1])-1):
  12.                 lst[i+1] = result[-1][i] + result[-1][i+1]

  13. func196(10)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-10 16:08:36 | 显示全部楼层
def tri(x):       
        if x==1:
                return 1               
        res=[[1],[1,1]]       
        for i in range(2,x):
                mx=max(res[i-1])
                res.append([mx])
                for j in range(i-1):
                        res[i].append(res[i-1][j]+res[i-1][j+1])
                res[i].append(mx)

        s=''
        for k in res:
                s+='\n'+str(k)[1:-1]
        return s[1:]

print(tri(10))

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-10 16:08:46 | 显示全部楼层
  1. def fun196(num):
  2.     list0 = [[1],[1,1]]
  3.     for i in range(2,num):
  4.         list1 = []
  5.         for j in range(len(list0[i-1])-1):
  6.             list1.append(list0[i-1][j]+list0[i-1][j+1])
  7.         list1.insert(0,max(list0[i-1]))
  8.         list1.append(max(list0[i-1]))
  9.         list0.append(list1)
  10.     for each in list0:
  11.         print(','.join(map(str,each)))

  12. >>> fun196(10)
  13. 1
  14. 1,1
  15. 1,2,1
  16. 2,3,3,2
  17. 3,5,6,5,3
  18. 6,8,11,11,8,6
  19. 11,14,19,22,19,14,11
  20. 22,25,33,41,41,33,25,22
  21. 41,47,58,74,82,74,58,47,41
  22. 82,88,105,132,156,156,132,105,88,82
  23. >>>
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-10 16:53:12 | 显示全部楼层
  1. def Good(num):
  2.     list1 = []
  3.     for x in range(num):
  4.         list1.append(list())
  5.         for y in range(len(list1)):
  6.             list1[x].append(1)
  7.     for x in range(2,num):
  8.         for y in range(1,x):
  9.             list1[x][y] = list1[x-1][y-1]+list1[x-1][y]
  10.     for x in range(3,num):
  11.         list1[x][x] = max(list1[x-1])
  12.         list1[x][0] = list1[x][x]
  13.     for x in range(3,num):
  14.         for y in range(1,x):
  15.             list1[x][y] = list1[x-1][y-1]+list1[x-1][y]
  16.             list1[x][x] = max(list1[x - 1])
  17.             list1[x][0] = list1[x][x]
  18.     for x in range(len(list1)):
  19.         print(','.join([str(i) for i in list1[x]]))

  20. Good(10)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-10 17:29:11 | 显示全部楼层
  1. def tri(n):
  2.     list1 = [1]
  3.     for i in range(n):
  4.         yield list1
  5.         list1 = [max(list1)] + [list1[j] + list1[j+1] for j in range(len(list1)-1)] + [max(list1)]
  6. for x in tri(10):
  7.     print(x)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-10 19:18:47 From FishC Mobile | 显示全部楼层
我忘了windows的return会不会显示,但好像linux不行,如果重复的话就把print删掉就OK了。
def tri(num):
        if num == 1:
                print([1])
                return [1]
        else:
                l = tri(num -1)
                if num - 2 == 0:
                        print([1,1])
                        return [1,1]
                else:
                        lst = [max(l)]
                        count = 1
                        while num - 1 > count:
                                lst.append(l[count - 1] + l[count])
                                count += 1
                        lst.append(max(l))
                        print(lst)
                        return lst

tri(10)

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-10 20:40:25 | 显示全部楼层
  1. def fun196(x):
  2.     line_1 = [1]
  3.     line_2 = []
  4.     for length in range(1,x+1):
  5.         if length == 1:
  6.             print('1')
  7.             continue
  8.         else:
  9.             for j in range(length):
  10.                 if j == 0 or j == length-1:
  11.                     line_2.append(str(max(line_1)))
  12.                 else:
  13.                     line_2.append(str(line_1[j-1]+line_1[j]))
  14.             print(','.join(line_2))
  15.             line_1 = [int(i) for i in line_2]
  16.             line_2 = []
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-10 20:48:39 | 显示全部楼层
  1. >>> def yh(func=None):
  2.         func = func if func else lambda x:1
  3.         r = [1]
  4.         while True:
  5.                 yield r
  6.                 m = func(r)
  7.                 r = [m] + [r[i]+r[i-1] for i in range(1,len(r))] + [m]

  8.                
  9. >>> def tri( n =10 ):
  10.         r = yh(max)
  11.         for i in range(n):
  12.                 print(str(next(r))[1:-1])

  13.                
  14. >>> tri(10)
  15. 1
  16. 1, 1
  17. 1, 2, 1
  18. 2, 3, 3, 2
  19. 3, 5, 6, 5, 3
  20. 6, 8, 11, 11, 8, 6
  21. 11, 14, 19, 22, 19, 14, 11
  22. 22, 25, 33, 41, 41, 33, 25, 22
  23. 41, 47, 58, 74, 82, 74, 58, 47, 41
  24. 82, 88, 105, 132, 156, 156, 132, 105, 88, 82
  25. >>>
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-10 21:10:06 | 显示全部楼层
话说,怎样证明每一行中仍然是:越靠近中间,数值越大呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-10 22:11:02 | 显示全部楼层
  1. def tri(value):
  2.     dat1 = [1]           #用于存储前一行的数据
  3.     dat2 = [1]           #用于存储新的数据
  4.     print('1')
  5.     for i in range(2, value+1):        #i代表第i行
  6.         dat1 = dat2
  7.         dat2 = [max(dat1)]
  8.         for j in range(1, i-1):       # j代表第i行的第j个数
  9.             dat2.append(dat1[j-1] + dat1[j])
  10.         dat2.append(max(dat1))
  11.         for each in dat2[:-1]:
  12.             print(each, end=', ')
  13.         print('%d' % dat2[-1])
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-11 00:06:38 | 显示全部楼层
def tri(num):
        def __add(L):
                P = L
                L = [1] + [ P[i] + P[i+1] for i in range(len(P) - 1)] + [1]
                print('  '*(num - len(P)),end='')
                for i in L :
                        print(i,end=', ')
                print('\n')
                return L
        
        print('  ' * (num-1),'1 \n')
        if num > 1:
                L = [1,1]
                print('  '*(num - 2),"1, 1 \n")
                for n in range(2,num):
                        L = __add(L)
                        
                    
                        
tri(10)

tri.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 15:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表