局部变量可能会引发的错误---误判---用阶乘函数求强数的 Python 程序中遇到的问题

背景介绍

        今天遇到这样一个额需求:用阶乘函数求强数的 Python 程序。所谓强数,就是一个特殊数字,满足其所有数字阶乘的和应等于数字本身的条件。

问题描述

def facorial_of_number(number):
    result = 1
    for i in range(1, number + 1):
        result *= i
    return result

def is_strong_number(number):
    sum = 0
    while number > 0:
        rem = number % 10
        sum += facorial_of_number(rem)
        number //= 10
    if sum == number :
        return True
    else:
        return False

num = int(input("enter a number : "))

if is_strong_number(num):
    print("{0} is strong number".format(num))
else:
    print("{0} is not strong number".format(num))

        因为事先知道145是一个强数,但在这里边却硬是把145判定为不是强数,这就很诡异!

 

 

开启debug模式,facorial_of_number(number)运行正常,

并且is_strong_number(number)中求得的阶乘之和sum也是正确的(145),

按理说sum=145,输入的number=145,正好sum = number,

但是为什么debug的下一步会直接跳到else里?

 原因分析

        哦!明白了!心机蛙一直在摸你肚子!注意看第二张debug图:啥时候number已经偷摸摸的变为0了,而不是输入的那个number = 145,所以显然就出错了嘛!

        number作为参数传入is_strong_number()中,在函数内就作为局部变量可以操作,每一次的整除10都会使number值发生变化,这样一来,操作的就不再是原始的number值了。

问题解决

        其实这个也好解决,无非就是找一个容器把原始的number保存下来,最后再拿来用就好了,笔者在这里就是用这样的方法:

def is_strong_number(num):
    sum = 0
    number = num
    while number > 0:
        rem = number % 10
        sum += facorial_of_number(rem)
        number //= 10
    if sum == num :
        return True
    else:
        return False

        再次运行,解决!

完结撒花

        之前遇到莫名奇怪的问题的时候总觉得是程序的错,但是程序是人写的,即使是程序的错也是人的原因,冷静下来分析问题是一种非常难得的态度,希望与大家共勉。

另附

        bug 只要管他,他就会自己修复。

        希望大家的程序都能如这句话。

你可能感兴趣的:(算法,pycharm,python)