西西软件园多重安全检测下载网站、值得信赖的软件下载站!
软件
软件
文章
搜索

首页编程开发C#.NET → 现实的世界和虚拟的计算机

现实的世界和虚拟的计算机

相关软件相关文章发表评论 来源:本站整理时间:2010/8/22 14:49:58字体大小:A-A+

作者:不详点击:400次评论:0次标签: Stack C# Stream

7stacks(stacks效果工具)1.5 beta2官方版
  • 类型:系统其它大小:2.7M语言:中文 评分:5.0
  • 标签:
立即下载

人们常常看着照片回忆起从前,清晰地感觉到童年,青年,中年,老年一路走来的各种变化。从这种变化中,我们可以抽象出3个关键词:对象、时间和状态。对象拥有状态和标识,在标识不变的情况下,状态随时间发展演变。这实际上代表了一种动态的世界观:时间本身并不属于世界,世界是在时间维度上不断演变的状态。在这种世界观的指导下,通过计算机程序模拟现实世界问题时,我们用计算机中的对象状态表示世界的状态,用计算机中对象的状态的变化表示世界状态的变化和时间进程。

 与上面动态的世界观不同,另一种世界观认为世界本质上是静止的。怎么理解呢?比如:对于一个历史人物,在他生活的每一天里都有变化,从这个角度看是状态的变化;但是如果纵观他的一生,其人生轨迹作为一个整体又是静止的,我们可以把这个整体作为一个研究的对象。这里,我们实际上把时间维度也纳入对象属性,使在3维中运动的对象变成了在4维中静止的对象。物理学上称对象在4维空间中的轨迹为对象的世界线(World Line)。另外,即使不是已经盖棺定论的对象,假如对象是有规律的,比如:一个物体的运动状态由某一个公式完全决定,即未来某一时刻它处于什么位置也是完全确定的,那么我们只要掌握了这个公式就掌握了物体的世界线。

我们把对象的世界线用x(t)来表示,如果时间是离散的,我们可以用一个序列(Sequence)来表示x(t)。与计算的对象模型通过状态改变来隐式地表示时间不同,我们可以把计算认为是输入序列input(t)到输出序列output(t)的变换,时间是通过离散序列的方式显式表示的。我们的程序实际上扮演了一个信号处理器的角色。

但有限序列的缺点在于它要求输入是完整的,因而无法处理交互的情况,比如:我们把用户的键盘输入input(t)无法用一个有限序列来表示。为了处理交互,我们引入了可用惰性求值的流(Stream)。流可用视为可用惰性求值的无穷序列,这样我们的程序就是一个信号处理器,输入时一个流,输出也是一个流。为了帮助理解,下面我们用一个C#实现的Stack的例子来说明:

//C#实现的基于流的Stack

public enum OperationType { PUSH, POP}

public struct Input{
    public OperationType Operation;
    public int Data;
}

class Stack
{
    public static IEnumerable<int> Transform(IEnumerable<Input> aSourceStream)
    {
        LinkedList<int> list = new LinkedList<int>();
        foreach(Input command in aSourceStream)
        {
             if(OperationType.PUSH== command.Operation)
             {
                  list.AddLast(command.Data);
             }
             else if (OperationType.POP == command.Operation)
             {
                  int data = list.Last.Value;
                  list.RemoveLast();
                  yield return data;
             }
        }
    }
}

public class InputGenerator
{
    public static IEnumerable<Input> Generate()
    {
        while (true)
        {
            string line = Console.ReadLine();
            if (line.StartsWith("push "))
            {
                yield return new Input { Operation = OperationType.PUSH, Data = int.Parse(line.Split(' ')[1]) };
            }
            else if (line == "pop")
            {
                yield return new Input { Operation = OperationType.POP };
            }
        }
    }
}

public static void Main(string[] args)
{
    foreach (int output in Stack.Transform(InputGenerator.Generate()))
    {
        Console.WriteLine(output);
    }
}

运行示例:

>>push 1

>>push 2

>>pop

2

>>push 3

>>pop

3

上面的例子中用户的输入被包装成无穷的Input输入流,Stack是从Input输入流到int输出流的信号处理器。

    相关评论

    阅读本文后您有什么感想? 已有人给出评价!

    • 8 喜欢喜欢
    • 3 顶
    • 1 难过难过
    • 5 囧
    • 3 围观围观
    • 2 无聊无聊

    热门评论

    第 1 楼 浙江宁波宁波大红鹰学院 网友 客人 发表于: 2010/12/28 16:55:29
    零碎的看了一点,在讲关于时间的科幻话题吗?

    支持( 0 ) 盖楼(回复)

    最新评论

    第 1 楼 浙江宁波宁波大红鹰学院 网友 客人 发表于: 2010/12/28 16:55:29
    零碎的看了一点,在讲关于时间的科幻话题吗?

    支持( 0 ) 盖楼(回复)

    发表评论 查看所有评论(0)

    昵称:
    表情: 高兴 可 汗 我不要 害羞 好 下下下 送花 屎 亲亲
    字数: 0/500 (您的评论需要经过审核才能显示)