Использование ptrdiff_t

Конечно, числа Фибоначчи могут быть вычислены в O (n), применяя формулу Бине:

from math import floor, sqrt

def fib(n):                                                     
    return int(floor(((1+sqrt(5))**n-(1-sqrt(5))**n)/(2**n*sqrt(5))+0.5))

Как отмечают комментаторы, это не O (1), а O (n) из-за 2**n. Также разница в том, что вы получаете только одно значение, а при рекурсии вы получаете все значения Fibonacci(n) до этого значения.

4
задан AShelly 26 March 2019 в 17:02
поделиться

2 ответа

Из спецификации (раздел 7.20.3)

Его значение, определяемое реализацией, должно быть равным или больше по величине (абсолютное значение) чем соответствующее значение, указанное ниже

[Emphasis mine]

Таким образом, упомянутые значения являются только минимальными значениями. Реализация может иметь большие ограничения. Я ожидал бы, что ptrdiff_t будет длиной слова целевой платформы (то есть 64-битного типа 64-битных систем).

И обратите внимание, что size_t является целым типом без знака , а ptrdiff_t является целым типом со знаком . Этот тип подразумевает, что не все значения size_t могут быть представлены ptrdiff_t.

0
ответ дан Some programmer dude 26 March 2019 в 17:02
поделиться

Это, похоже, проблема в самом стандарте C.

Как вы заметили, 6.5.6 Аддитивные операторы , пункт 9 , в частности, гласит:

Когда вычитаются два указателя, оба должны указывать к элементам одного и того же объекта массива или одному последнему элементу объекта массива; Результатом является разница индексов двух элементов массива. Размер результата определяется реализацией, а его тип (целочисленный тип со знаком) определяется как ptrdiff_t в заголовке <stddef.h>. Если результат не может быть представлен в объекте этого типа, поведение не определено. Другими словами, если выражения P и Q указывают соответственно на i -й и j -й элементы массива, выражение (P)-(Q) имеет значение i-j [1123 ] при условии, что значение соответствует объекту типа ptrdiff_t . ...

В стандарте C, похоже, нет гарантии, что вы можете представить разницу двух указателей в ptrdiff_t.

Реально, это будет означать, что ptrdiff_t должно быть больше, чем size_t. size_t должен покрывать только величину в фиксированном количестве битов. ptrdiff_t должен охватывать как величину, так и направление. Если sizeof( size_t ) == sizeof( ptrdiff_t ), то нет гарантии, что неопределенное поведение в 6.5.6p9 не будет вызвано.

0
ответ дан Andrew Henle 26 March 2019 в 17:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: