Otteel 发表于 2020-4-26 16:55:09

python用递归函数和正常输出相比,少了一位小数


def chengjie1(n):
    sum=0;
    if n==1:
      sum=sum+(1/ (n * (n + 1)))
      returnsum
    else:
      sum=(1/ (n * (n + 1))+chengjie1(n-1))
      return sum
print(chengjie1(12))
print(12/13)
结果如下:
0.923076923076923   这个是递归的。
0.9230769230769231这个是正常输出的。

Otteel 发表于 2020-4-26 16:58:15

这个是什么问题,
输出print(chengjie1(14))
print(14/15)
结果如下0.9333333333333332用递归
0.9333333333333333没用递归

sunrise085 发表于 2020-4-26 17:18:21

这个仅仅是运算精度问题。15位有效数字

Otteel 发表于 2020-4-26 17:20:17

sunrise085 发表于 2020-4-26 17:18
这个仅仅是运算精度问题。15位有效数字

这个能解决吗?

zltzlt 发表于 2020-4-26 17:20:37

运算精度的问题,可以忽略

Otteel 发表于 2020-4-26 17:21:23

sunrise085 发表于 2020-4-26 17:18
这个仅仅是运算精度问题。15位有效数字

while循环和递归函数的精度是不是一样的

773254968 发表于 2020-4-26 17:21:36

除不尽的数你没有考虑进去吧。
无理数和无限循环小数。

Otteel 发表于 2020-4-26 17:24:22

zltzlt 发表于 2020-4-26 17:20
运算精度的问题,可以忽略

0.9899999999999997 这个是递归
0.99 这个是while循环的
他们精度不一样的吗?

Otteel 发表于 2020-4-26 17:25:37

zltzlt 发表于 2020-4-26 17:20
运算精度的问题,可以忽略

主要是递归函数那个值越大,离标准答案的值就越不准确,这个不能解决吗?

sunrise085 发表于 2020-4-26 17:25:45

Otteel 发表于 2020-4-26 17:20
这个能解决吗?

解决不了,这是计算机存储问题
计算机是以二进制进行存储的,数据存储过程中基本都有精度损失。有效位数是15位,之后的就不精确了。
只有少数是没有精度损失的,例如0.5,0.125,0.625等能够用2完整分割的小数一般是没有精度损失的

zltzlt 发表于 2020-4-26 17:27:35

Otteel 发表于 2020-4-26 17:24
0.9899999999999997 这个是递归
0.99 这个是while循环的
他们精度不一样的吗?

这是编程语言共存的问题

Otteel 发表于 2020-4-26 17:59:07

sunrise085 发表于 2020-4-26 17:25
解决不了,这是计算机存储问题
计算机是以二进制进行存储的,数据存储过程中基本都有精度损失。有效位数 ...

为什么循环是16位,而递归是15位呢?
页: [1]
查看完整版本: python用递归函数和正常输出相比,少了一位小数