zoukankan      html  css  js  c++  java
  • 函数嵌套 lisp表达式求值

    问题 D: lisp表达式求值

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 105  解决: 43
    [提交][状态][讨论版]

    题目描述

    lisp是一种非常古老的计算机语言,是由约翰·麦卡锡在1960年左右创造的一种基于λ演算的函数式编程语言,其语法如下:

    (+ 2 3 4 5)

    表示2+3+4+5,其值为14

    (* 2 3 5)

    表示2*3*5,其值为30

    减法可以表示为:

    (- 2 3 4)

    表示:2-3-4=-5

    即括弧中第一个符号为运算符,后面是操作数,改运算也可以嵌套,比如

    (* (+ 2 3) 6)

    表示先计算2+3=5,然后再5*6=30

    麦卡锡当初提出了一套理论,其核心是一个eval函数,1958年年底,麦卡锡的一个学生史蒂夫•拉塞尔 看到了eval函数的定义,意识到如果把它翻译成机器语言,就可以把Lisp解释器做出来。这在当时是非常令人吃惊的事。麦卡锡后来回忆:拉塞尔对我说:“我想把eval编成程序……”我告诉他,别把理论和实践混淆,eval只是用来读的,不是用来做计算的。但是他执意要做,并且还真的做出来了。就是说,他把我论文中的eval编译成了[IBM] 704计算机的机器码,修正了bug,然后对外宣布做出了Lisp语言的一种解释器,这倒没有说错,确实如此。所以,从那个时候开始,Lisp语言就基本上是它现在的样子了……

    现在,请你完成这个任务, 给出一个lisp表达式,计算出其结果

    输入

    一个lisp表达式

    输出

    该表达式的值

    样例输入

    (+ 2 (* 3 4) (- 3 5))

    样例输出

    12
     
     1 #include<stdio.h>
     2 #include<string.h>
     3 char s[1000],ch;
     4 int n,k;
     5 long dfs(int t,char c)
     6 {
     7     int i=0,j,a[100];
     8     long ans;
     9     while (s[k]!=')')
    10     {
    11         if (s[k]=='(')
    12         {
    13             k++;
    14             while (s[k]==' ') k++;
    15             ch=s[k];
    16             i++;
    17             a[i]=dfs(t+1,ch);
    18         }
    19         else if (s[k]==' ') k++;
    20         else if (s[k]>='0'&&s[k]<='9')
    21         {
    22             i++;
    23             a[i]=s[k]-48;
    24             k++;
    25         }
    26         else k++;
    27     }
    28     ans=a[1];
    29     if (c=='+')
    30     for (j=2;j<=i;j++)
    31         ans+=a[j];
    32     if (c=='-')
    33     for (j=2;j<=i;j++)
    34         ans-=a[j];
    35     if (c=='*')
    36     for (j=2;j<=i;j++)
    37         ans*=a[j];
    38     if (c=='/')
    39     for (j=2;j<=i;j++)
    40         ans/=a[j];
    41     k++;
    42     return ans;
    43 }
    44 
    45 int main()
    46 {
    47     gets(s);
    48     n=strlen(s);
    49     k=0;
    50     while (s[k]!='(')
    51         k++;
    52     k++;
    53     while (s[k]==' ')
    54         k++;
    55     ch=s[k];
    56     printf("%ld
    ",dfs(1,ch));
    57     return 0;
    58 }
  • 相关阅读:
    Linux使用Public Key方式远程登录
    Linux编译安装Mariadb数据库
    Centos7环境搭建lnmp环境
    浅谈Java中的System.gc()的工作原理
    Eclipse快捷键大全(转载)
    java中的参数传递——值传递、引用传递
    Visual Studio 2017 安装后无法创建c++或MFC项目
    ubuntu sendmail配置发送邮件
    ubuntu11.0静态IP地址配置
    cin与cout详解
  • 原文地址:https://www.cnblogs.com/wushuaiyi/p/3481362.html
Copyright © 2011-2022 走看看