拓展,Fibonacci螺旋

#该程序由023递归这课中的fibonacci数列递归写法修改而成
#在写的过程中发现,如果要正确引导用户的每一次输入,写的代码比主程序还要多
#当然,为了使程序在用户交互过程中显得更加友好,提供错误提示也是一个好习惯
#
#由fibonacci螺旋递归写法引申出的字串符格式化和内置方法的探索

level = input('请输入Fibonacci螺旋层数:')

#判断输入字符是否为大于0的整数,.isdigit()方法是判断字串符是否为整数
#当然非数字或者是小数点都不在整数范围
#在shell测试了一下发现负整数也不能用.isdigit()方法
while not level.isdigit() or int(level) == 0:
    level = input('输入错误,请重新输入大于0的正整数):')
#注意,我在这里用了float使输入的数字变为浮点数
#以我现在的知识,如果这里不用float转化,
#那么接下来的函数里 fab(level-1) + fab(level-2)会变为字串符的拼接。原因目前未明。  
print('注意:两个数字不能同时为0!')
FirstNum = float(input('第一个数字'))
SecondNum = float(input('第二个数字'))

#判断两个数字是否同时为0,注意,用and这个操作符
while FirstNum == 0 and SecondNum == 0:
    print('注意:两个数字不能同时为0!')
    FirstNum = float(input('第一个数字'))
    SecondNum = float(input('第二个数字'))

#循环打印输出,如果不加for语句,那么只输出最后那个结果
#如果for level in里的level换成其他,那么
for level in range(1,int(level)+1):
    #以下是递归主程序
    def fab(level): 
        #初始最开始两个数字的值
        if level == 1:
            global FirstNum
            return FirstNum
        elif level == 2:
            global SecondNum
            return SecondNum
        #如果没有上面那两个if判断,那么程序将进入死循环,原因是不是因为递归没给初始值呢?
        else:
            return (fab(level-1) + fab(level-2))
    
    result = fab(level)
    #%.2f把浮点数格式化为带两个小数点输出
    print('%.2f' % result, end = '  ')

测试:

请输入Fibonacci螺旋层数:abc
输入错误,请重新输入大于0的正整数):-5
输入错误,请重新输入大于0的正整数):0
输入错误,请重新输入大于0的正整数):8
注意:两个数字不能同时为0!
第一个数字-2.9
第二个数字3.15
-2.90  3.15  0.25  3.40  3.65  7.05  10.70  17.75
posted @ 2014-03-02 16:23  小丑戌  阅读(302)  评论(0编辑  收藏  举报