我最近为某个公司的预采访做了一个编程问题.问题是:
创建一个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})
Run Code Online (Sandbox Code Playgroud)
"最新"视图是我的第二个版本,因为第一个版本不能始终如一地工作.原始版本将结果存储在LATEST中的"index"中.LATEST最初是一个fib序列(列表)列表,而不是N的最近值列表.
我想我的主要问题是,在views.py文件中存储运行时生成的最大fib序列是不是很糟糕?我知道这不是持久性的,但指令从未真正详细说明应如何完成任务.你们有什么想法,你们将如何处理这个问题?
多谢你们!
每个线性递推方程都可以直接求解。在斐波那契的情况下,方程是
f_n+2 = f_n+1 + f_n
f_1 = 1
f_2 = 1
Run Code Online (Sandbox Code Playgroud)
解决这个问题的方法是:
f_n = 1/sqrt(5) * ((1+sqrt(5))/2)^n - 1/sqrt(5) * ((1-sqrt(5))/2)^n
Run Code Online (Sandbox Code Playgroud)
使用这个直接公式。要了解如何实现它,请寻找线性递推方程求解。例如这里。
由于浮点错误,您应该将结果四舍五入到最接近的整数。
| 归档时间: |
|
| 查看次数: |
3316 次 |
| 最近记录: |