英文:
Memoisation - Bernoulli numbers
问题
我理解你只需要对代码进行翻译,以下是代码的翻译部分:
from fractions import Fraction
from scipy.special import comb
import numpy as np
# 缓存
bernoulli_cache = {}
def bernoulli(n: float):
# 检查输入,如果存在则返回值
if n in bernoulli_cache:
return bernoulli_cache[n]
# 当输入为0或1时
if n == 0:
value = Fraction(1)
else:
value = Fraction(1)
for k in range(n):
value -= Fraction(comb(n, k)) * Fraction(bernoulli(k), (n - k + 1))
# 写入缓存
bernoulli_cache[n] = value
# 分数部分用于输出
numerator = value.numerator
denominator = value.denominator
return numerator, denominator
# 测试是否有效 - 缓存中已有部分
bernoulli_cache = {}
bernoulli(0) # 1
bernoulli(1) # 1/2
bernoulli(2) # 1/6
bernoulli(3) # 0
bernoulli(4) # −1/30
bernoulli(5) # 0
bernoulli(6) # 1/42
bernoulli(7) # 0
bernoulli(8) # -1/30
# 这个不会有效 - 缓存中没有部分
bernoulli_cache = {}
bernoulli(8) # -1/30
希望这对你有所帮助!
英文:
I am trying to compute some Bernoulli numbers and am trying to use memoisation. In the example below, I can get the Bernoulli number for 8 when I run 1-7 before it, but not if the cache is clear. What changes would I need to make to run it when the cache is clear?
from fractions import Fraction
from scipy.special import comb
import numpy as np
# memoisation
bernoulli_cache = {}
def bernoulli(n: float):
# check input, if it exists, return value
if n in bernoulli_cache:
return bernoulli_cache[n]
# when input is 0 or 1
if n == 0:
value = Fraction(1)
else:
value = Fraction(1)
for k in range(n):
value -= Fraction(comb(n, k)) * Fraction(bernoulli(k), (n - k + 1))
# write to cache
bernoulli_cache[n] = value
# fraction parts for output
numerator = value.numerator
denominator = value.denominator
return numerator, denominator
# test this works- bits in cache aleady
bernoulli_cache = {}
bernoulli(0) # 1
bernoulli(1) # 1/2
bernoulli(2) # 1/6
bernoulli(3) # 0
bernoulli(4) # −1/30
bernoulli(5) # 0
bernoulli(6) # 1/42
bernoulli(7) # 0
bernoulli(8) # -1/30
# this doesn't - bits not in cache
bernoulli_cache = {}
bernoulli(8) # -1/30
答案1
得分: 1
Your cache is storing a Fraction so when you have a cache hit you're returning a Fraction. When you have a cache miss you're returning a tuple. You can fix this by changing return numerator, denominator
to return Fraction(numerator, denominator)
.
英文:
Your cache is storing a Fraction so when you have a cache hit you're returning a Fraction. When you have a cache miss you're returning a tuple. You can fix this by changing return numerator, denominator
to return Fraction(numerator, denominator)
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论