Python 你会如何回答django面试的问题?

Python 你会如何回答django面试的问题?,python,django,Python,Django,我最近为某公司的面试前做了一个编程问题。问题是: 创建一个django应用程序,当然是测试驱动的,向全世界显示斐波那契序列。应用程序应该获取一个索引号并显示结果斐波那契序列。此外,应该有一个页面显示最近生成的序列。另外,Fibonacci有点不耐烦,不想永远等待,所以请确保采取措施确保Web服务器高效运行 我得出了以下结论: from django.views.generic.simple import direct_to_template from django.http import Htt

我最近为某公司的面试前做了一个编程问题。问题是:

创建一个django应用程序,当然是测试驱动的,向全世界显示斐波那契序列。应用程序应该获取一个索引号并显示结果斐波那契序列。此外,应该有一个页面显示最近生成的序列。另外,Fibonacci有点不耐烦,不想永远等待,所以请确保采取措施确保Web服务器高效运行

我得出了以下结论:

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最初是一个fib序列列表(列表),而不是最近N值的列表

我想我的主要问题是,在views.py文件中存储运行时生成的最大fib序列是否不好?我知道这不是持久的,但是说明书从来没有真正给出应该如何做的细节。你们怎么想,你们会怎么解决这个问题


谢谢大家

每个线性回归方程都可以直接求解。 在斐波那契的例子中,方程是

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
使用这个直接公式。 对于如何得到它,请寻找线性回归方程求解。例如


由于浮点错误,您应该将结果四舍五入到最接近的整数。

尽管在
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
对于视图,我只想这样做:

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个条目非常简单。

在Python中,这意味着使用
**
而不是
^
int(round())
而不仅仅是
int()
。另外,我不确定这会给他们留下深刻印象——这是关于用Django存储信息的问题还是关于了解的问题“每个线性回归方程都可以直接求解“?当我采访别人时,我对正确的做事方式印象深刻——如果我所要求的能以我所希望的方式做得更好,而不是我的差劲,而不是候选人:这是一个好答案,我投了你一票,我只是想知道OP是否知道这个问题在寻找什么。好吧,我知道这在快速计算第n个fib数时是多么有用,但问题要求的是序列。这个解决方案是否意味着,比如说,如果请求第50个斐波那契数,我将从1-50计算每个斐波那契数,并输出该值,而不存储任何结果?存储生成的最大fibonacci序列并重用已经生成的结果(我就是这么做的)有意义吗?我解释这个问题的方式是,它想要一个序列作为最终结果,而不仅仅是第n个fibonacci数。我错了吗?@user701632在这种情况下,只需预先计算可能的答案并将其存储在模型中就更容易了。检索答案,就这样。@user701632实际上这就是OP所问的。我真丢脸。
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})