鱼C论坛

 找回密码
 立即注册
查看: 2928|回复: 17

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

[复制链接]
发表于 2018-3-24 15:45:45 | 显示全部楼层 |阅读模式

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

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

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

1.答对题目的前十位鱼油有资格获得鱼币(我是穷人)代码简洁,运行效率高者获胜
2. 请大家先独立思考,再参考其他鱼油的解答,这样才有助于自己编程水平的提高。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内
4. 根据答案的质量给予前十名鱼油 10 鱼币的奖励。
5. 当然我们的题目是面向新人出滴,也是想通过鱼币奖励给他们动力。所以,提高评分,让新人们可以有更多的机会学习。

今日题目:

感谢 @天圆突破 的题目,请在下面回复给予你奖励。
发现斐波那契数列还有好多好玩的地方。
我们知道,当斐波那契数列的项目无限大的时候,相邻项目的比会无限接近于黄金分割比。
那么相隔一项(例如第1项和第三项)呢?相隔两项(例如第1项和第四项)呢?相隔n项呢?是不是还是收敛的?
请设计一个程序,验证这个结论。
设计要求:
设计一个函数func(n),参数n是相隔的项数。(n=1时是相邻两项,n=2时是相隔一项,以此类推)
实现以下图的打印效果:
1.持续显示相隔n项的值
2.使用input()控制输出
3.输入q的时候结束程序

————————————————————————学术上的研究————————————————————————

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2018-3-24 16:37:12 | 显示全部楼层
本帖最后由 塔利班 于 2018-3-24 17:04 编辑
  1. def fib():
  2.     a=0
  3.     b=1
  4.     while True:
  5.         a,b=b,a+b
  6.         yield a
  7. def func(n):
  8.     x=fib()
  9.     a=next(x)
  10.     i=0
  11.     input()   
  12.     print(a)
  13.     while True:
  14.         a=next(x)
  15.         i+=1
  16.         if i%n==0:
  17.             s=input()
  18.             if s=='q':
  19.                 return None
  20.             print(a)
复制代码


按理解写了个 - -

评分

参与人数 1鱼币 +10 收起 理由
新手·ing + 10

查看全部评分

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

使用道具 举报

发表于 2018-3-24 17:13:54 | 显示全部楼层
本帖最后由 晓屁屁 于 2018-3-24 17:54 编辑

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

使用道具 举报

发表于 2018-3-24 18:17:12 | 显示全部楼层
  1. def func(number,n):
  2.         fib = []
  3.         fib.append(1)
  4.         fib.append(1)
  5.         for i in range(2,number):
  6.                 fib.append(fib[i-1] + fib[i-2])

  7.         for i in range(0,number,n):
  8.                 print(fib[i])

  9. if __name__ == '__main__':
  10.         number = int(input('请输入fib数列的项数:'))
  11.         n = input('请输入要隔的位数:')
  12.         while n != 'q':
  13.                 func(number,int(n))
  14.                 number = int(input('请输入fib数列的项数:'))
  15.                 n = input('请输入要隔的位数:')

复制代码


要求代码简洁是不是针对我

评分

参与人数 1鱼币 +10 收起 理由
新手·ing + 10 嘿嘿

查看全部评分

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

使用道具 举报

发表于 2018-3-24 18:18:18 | 显示全部楼层
本帖最后由 8306最硬 于 2018-3-24 18:43 编辑
  1. def func(n):
  2.     a, b = 0, 1
  3.     while True:
  4.         cnt = n
  5.         print(b)
  6.         while cnt:
  7.             a, b = b, a + b
  8.             cnt -= 1        
  9.         if input() == 'q':
  10.             return
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-24 19:01:31 | 显示全部楼层
  1. def func(n):
  2.     a = 1
  3.     b = 1
  4.     an = 0
  5.     count = 0
  6.     while True:
  7.         an = a + b
  8.         a = b
  9.         b = an
  10.         if count % n == 0:
  11.             print an
  12.             con = raw_input('请按任意键继续输出,按‘q’退出:')
  13.             if con =='q'or con == 'Q':
  14.                 break
  15.         count += 1

  16. func(3)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-24 20:01:04 | 显示全部楼层
def func(n):
    a=0  
    b=1  
    for i in range(0,n*8):
        if i%n==0:            
            c=a+b
            print(c)
            a=b
            b=c
        else:
            c=a+b
            a=b
            b=c
bb=0
print("测试版,只持续显示8组数据如需要可以增加")
while bb!='q':
    bb=input("请输入要间隔项,必须为不为0正整数,输入'q'结束")
    if bb!='q':
        func(int(bb))
print('结束')

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

使用道具 举报

发表于 2018-3-24 20:06:16 | 显示全部楼层
本帖最后由 天圆突破 于 2018-3-24 20:48 编辑

方法一:这道题本来就是玩协程的时候玩出来的XD
  1. def fib():
  2.     a = b = 1
  3.     while True:
  4.         count = yield a
  5.         if count != None:
  6.             print('斐波那契数列的第%d项是:%d'%(count, a))
  7.         a,b = b,a+b

  8. def func(n):
  9.     print('验证当n=%d时候的情况,输入:q退出,其他继续:\n')
  10.     s1, s2, i= fib(), fib(), 1
  11.     next(s1);next(s2)
  12.     for j in range(n):
  13.         s2.send(None)
  14.     while True:
  15.         a = s1.send(i)
  16.         b = s2.send(i+n)
  17.         print('斐波那契的第%d项和第%d项的比是%.40f'%(i,i+n,a/b))
  18.         i += 1
  19.         if input() == ':q':
  20.             break
复制代码


方法二
  1. def func(n):
  2.     a,b,i,lst = 1,1,1,list()
  3.     print('验证n=%d的情况,按:q退出,其他继续:\n'%n)
  4.     while True:
  5.         lst.append(a)
  6.         if len(lst) == n+1:
  7.             s = lst.pop(0)
  8.             print('斐波那契数列的第%d项是:%d'%(i-n,s))
  9.             print('斐波那契数列的第%d项是:%d'%(i,b))
  10.             print('斐波那契的第%d项和第%d项的比是%.40f' % (i-n, i, s / b))
  11.         a,b = b,a+b
  12.         i += 1
  13.         if input() == ':q':
  14.             break
复制代码

  1. if __name__ == '__main__':
  2.     func(1)
复制代码


顺便,领奖励^^

评分

参与人数 1鱼币 +10 收起 理由
新手·ing + 10

查看全部评分

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

使用道具 举报

发表于 2018-3-24 21:43:38 | 显示全部楼层
  1. '''
  2. 我们知道,当斐波那契数列的项目无限大的时候,相邻项目的比会无限接近于黄金分割比。
  3. 那么相隔一项(例如第1项和第三项)呢?相隔两项(例如第1项和第四项)呢?相隔n项呢?是不是还是收敛的?
  4. 请设计一个程序,验证这个结论。
  5. 设计要求:
  6. 设计一个函数func(n),参数n是相隔的项数。(n=1时是相邻两项,n=2时是相隔一项,以此类推)
  7. 实现以下图的打印效果:
  8. 1.持续显示相隔n项的值
  9. 2.使用input()控制输出
  10. 3.输入q的时候结束程序
  11. '''
  12. def gFib():
  13.     a=1
  14.     b=1
  15.     yield a
  16.     while True:
  17.         a,b=b,a+b
  18.         yield a

  19. def func(n):
  20.     xfib=gFib()
  21.     yfib=gFib()
  22.     a=next(xfib)
  23.     for i in range(n+1):
  24.         b=next(yfib)
  25.     print ('%10d   /    %10d = %.30f' %(a,b,a/b))
  26.     while (input()!='q'):
  27.         a=next(xfib)
  28.         b=next(yfib)
  29.         print ('%10d   /    %10d = %.30f' %(a,b,a/b))
  30. func(3)
复制代码

评分

参与人数 1鱼币 +10 收起 理由
新手·ing + 10

查看全部评分

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

使用道具 举报

发表于 2018-3-25 00:43:52 | 显示全部楼层
def Fib():
    m=n=1
    yield m
    while True:
        m,n=n,m+n
        yield m
def func(n):
    fib = Fib()
    while (input() != 'q'):
        for i in range(n+1):
            a = next(fib)
        print(a)
n=eval(input('请输入斐波那契数列间隔:'))
print('func(%d)'% n)
print('回车键依次显示该数列,输入q并回车,结束')
func(n)

评分

参与人数 1鱼币 +10 收起 理由
新手·ing + 10

查看全部评分

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

使用道具 举报

发表于 2018-3-25 17:29:01 | 显示全部楼层
def func(n):
    n = int(n)
    a = 1
    b = 1
    c = a + b
    s = 0
    while True:
        if s % n == 0:
            print(a)
            t = input()
            if t == 'p':
                break
        s += 1
        a = b
        b = c
        c =a + b
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-25 22:35:01 | 显示全部楼层
def func(n):
    a,b,c,d,i,ss=1,1,1,1,1,''
    while i<n+1 :
        i+=1
        a,b=b,a+b
    while ss!='q' :
        print(d/b)
        a,b,c,d=b,a+b,d,c+d
        ss=input()
    return d/b

n=int(input())
print(func(n))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-25 23:04:03 | 显示全部楼层
不知道怎样一边不断的输出,按q下去后又能停止,所以就曲线救国按任意键输出按q结束了,另外百度看到了斐波那契数列是有通项公式的,所以我和上面用递归的不!一!样!哈哈哈~另外貌似这个结论是错的,相隔越大,这个比例就越小~~再另外,出题太快了一没注意动态,昨天就出了俩都没来的及答
  1. import math as m

  2. def fib(i):
  3.     return int((((1+m.sqrt(5))/2)**i - ((1-m.sqrt(5))/2)**i) / m.sqrt(5))

  4. def func(n):
  5.     while 1:
  6.         for i in range(1, 9999999, n):
  7.             if input() == 'q':
  8.                 print('前后两项比例为:%.3f' % (fib(i)/fib(i+n)))
  9.                 break
  10.             print(fib(i), end='')

  11. func(int(input('请输入要间隔的项数:')))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-26 14:09:05 | 显示全部楼层
  1. def func(n):
  2.         a,b,s,k=1,1,1,0
  3.         while True:
  4.                 b,a=a+b,b
  5.                 k+=1
  6.                 if k==n:
  7.                         cnt=input("anykey to continue,'q' to exit--")
  8.                         if cnt=='q':
  9.                                 break
  10.                         print(b/s)
  11.                         s=b
  12.                         k=0
  13. func(10)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-26 21:04:18 | 显示全部楼层
来晚咯

def fun(i):
    if i == 0 or i ==1:
        return 1
    else:
        return fun(i-1) + fun(i-2)
def func(n):
    for i in range(100):
        t = input()
        if t != 'q'and t != 'Q':
                   x = fun(i)
                   y = fun(i+n)
                   s = x/y
                   print('第'+ str(i) +'项和第' + str(i+n)  + '项的比为:' + str(s) + '\n')
        else:
            return None
n = int(input('间隔项数:'))
func(n)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-27 15:44:40 | 显示全部楼层
  1. import sys

  2. def func(n):
  3.     a, b = 0, 1
  4.     for i in range(n):
  5.         a, b = b, a + b
  6.         print('%.3f' % (a / b))
  7.         temp = input()
  8.         if temp == 'q':
  9.             sys.exit()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-26 11:04:09 | 显示全部楼层
a1 = 0
a2 = 1
a3 = 1
def fibo(n):
        global a1,a2,a3
        i = 0
        while i<n:
                a3 = a1 + a2
                a1 = a2
                a2 = a3
                i += 1
n = int(input('请输入相隔的数:'))
def func(n):
        fibo(n)
        print(a3)
        while True:
                n = input('请输入相隔得数:')
                if n == 'q':
                        print('退出!')
                        break
                fibo(int(n))
                print(a3)
if __name__== '__main__':
   func(n)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-13 07:43:07 | 显示全部楼层
def fun(n):
    a, b = 1, 1
    while True:
        m = b
        for i in range(n):
            a, b = b, a + b
        yield m


while True:
    n = (input("please input a num_like"))
    if n == "q" or n == "Q":
        break
    n = int(n)
    for i in fun(n):
        if i < 10000:
            print(("m:%s"%i))
        else:
            break
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 13:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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