D 中的无限数据结构

发布于 2024-11-17 14:39:49 字数 311 浏览 2 评论 0原文

我在 D http://www.digitalmars.com/d/2.0 中找到了函数参数惰性求值的示例/lazy-evaluation.html

我想知道如何在 D 中实现可能的无限数据结构,就像 haskell 列表的常见行为一样。

有一些例子吗?

无限斐波那契数列等价于什么:

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

I found examples of lazy evaluation of function arguments in D http://www.digitalmars.com/d/2.0/lazy-evaluation.html

I´m wondering how to implement possible infinite Datastructures in D like it´s common behaviour of haskell´s lists.

Are there some Examples ?

What is the equivalent of the infinite fibonacci sequence:

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

离去的眼神 2024-11-24 14:39:50

Arlen 在评论中提到 D 版本很快就会溢出,因为它不使用 bigint。幸运的是,bigint 可以作为库模块使用,并且与recurrence 兼容:

import std.bigint;
auto fibs = recurrence!"a[n-1] + a[n-2]"(BigInt(1), BigInt(1));

Arlen mentioned in a comment that the D version quickly overflows, because it doesn't use bigints. Fortunately, bigints are available as a library module, and are compatible with recurrence:

import std.bigint;
auto fibs = recurrence!"a[n-1] + a[n-2]"(BigInt(1), BigInt(1));
美煞众生 2024-11-24 14:39:50

这基本上与 Mehrdad 的答案相同,但在我看来,使用了稍微更具可读性的语法:

recurrence!"a[n-1] + a[n-2]"(1, 1)

This is basically the same thing as Mehrdad's answer but uses, in my opinion, slightly more readable syntax:

recurrence!"a[n-1] + a[n-2]"(1, 1)
记忆消瘦 2024-11-24 14:39:50

棘轮怪人涵盖了斐波那契。

因为它是作为值类型实现的,所以获取它的副本将按预期运行。这也适用于任何大小的任何“数据结构”(因为OP正在使用它,而不是结构),其中有限的存储量和转换操作可以定义从任何点可达的域。

ratchet freak covered Fib.

Because it is implemented as a value type, taking copies of it will act as expected. This will also work for any "data structure" (as the OP was using it, not a struct) of any size where a finite amount of storage and a transition operation can define the reachable domain from any point.

寂寞美少年 2024-11-24 14:39:49
recurrence!((s,n) { return s[n-1] + s[n-2]; })(0, 1)
recurrence!((s,n) { return s[n-1] + s[n-2]; })(0, 1)
香草可樂 2024-11-24 14:39:49

查看示例中如何实现随机 https:// github.com/D-Programming-Language/phobos/blob/master/std/random.d

但这是斐波那契数列

struct FiboRange{
    enum bool empty=false;//infinite range

    long prev=0,curr=1;//the state for next calculations

    @property long front(){
        return curr;//current value
    }

    void popFront(){//calculate the next value
        long tmp = curr;
        curr += prev;
        prev = tmp;
    }

}

check out how randoms are implemented for an example https://github.com/D-Programming-Language/phobos/blob/master/std/random.d

but here's the fibonacci sequence

struct FiboRange{
    enum bool empty=false;//infinite range

    long prev=0,curr=1;//the state for next calculations

    @property long front(){
        return curr;//current value
    }

    void popFront(){//calculate the next value
        long tmp = curr;
        curr += prev;
        prev = tmp;
    }

}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文