我最近为某个公司的预采访做了一个编程问题。问题是:
创建一个django应用程序,当然是测试驱动,向世界展示斐波纳契的序列。应用程序应采用索引号并显示生成的斐波纳契序列。此外,应该有一个页面显示最近生成的序列。此外,Fibonacci有点不耐烦,不想永远等待,所以请确保您采取措施确保您的网络服务器有效运行。
我想出了以下内容:
from django.views.generic.simple import direct_to_template
from django.http import Http404
LARGEST_SEQUENCE = [0,1]
LARGEST = 1
LATEST = []
def fib(n):
"""Calculate the nth fibonacci sequence"""
global LARGEST
if n > LARGEST:
while n > LARGEST:
next = LARGEST_SEQUENCE[LARGEST] + LARGEST_SEQUENCE[LARGEST-1]
#print 'appending ', next
LARGEST_SEQUENCE.append(next)
LARGEST += 1
return LARGEST_SEQUENCE
else:
return LARGEST_SEQUENCE[0:n+1]
def latest(request):
results=[]
for n in LATEST:
result = fib(n)
results.append((n,result))
return direct_to_template(request, 'latest.html', {'results':results})
def index(request):
if request.method=="POST":
try:
n=int(request.POST.get('n'))
except:
return Http404
result = fib(n)
if len(LATEST) >= 5:
LATEST.pop()
LATEST.insert(0,n)
else:
result = None
return direct_to_template(request, 'base.html', {'result':result})
“最新”视图是我的第二个版本,因为第一个版本不能始终如一地工作。原始版本将结果存储在LATEST中的“index”中。 LATEST最初是一个fib序列(列表)列表,而不是N的最近值列表。
我想我的主要问题是,在views.py文件中存储运行时生成的最大fib序列是不是很糟糕?我知道这不是持久性的,但指令从未真正详细说明应如何完成任务。你们有什么想法,你们将如何处理这个问题?
谢谢你们!
答案 0 :(得分:4)
每个线性reccurence方程都可以直接求解。 在斐波那契的情况下,等式是
f_n+2 = f_n+1 + f_n
f_1 = 1
f_2 = 1
解决方法是:
f_n = 1/sqrt(5) * ((1+sqrt(5))/2)^n - 1/sqrt(5) * ((1-sqrt(5))/2)^n
使用此直接公式。 如何找到线性再生方程求解。例如。 here
由于浮点错误,您应该将结果舍入到最接近的整数。
答案 1 :(得分:4)
尽管在O(1)
中有一个众所周知的计算公式,但它对于大数(即100)来说是失败的。
我会为斐波纳契做下一件事:
def fib(n):
"Complexity: O(log(n))"
if n <= 0:
return 0
i = n - 1
(a, b) = (1, 0)
(c, d) = (0, 1)
while i > 0:
if i % 2:
(a, b) = (d * b + c * a, d * (b + a) + c * b)
(c, d) = (c * c + d * d, d * (2 * c + d))
i = i / 2
return a + b
对于lastes数字,我会创建一个模型。
from django.db import models
class Fibonacci(models.Model):
parameter = models.IntegerField(primary_key=True)
result = models.CharField(max_length=200)
time = models.DateTimeField()
对于视图我会这样做:
from models import Fibonacci
def index(request):
result = None
if request.method=="POST":
try:
n=int(request.POST.get('n'))
except:
return Http404
try:
result = Fibonacci.objects.get(pk=n)
result.time = datetime.now()
except DoesNotExist:
result = str(fib(n))
result = Fibonacci(n, result, datetime.now())
result.save()
return direct_to_template(request, 'base.html', {'result':result.result})
使用模型来检索最后n个条目非常简单。