假设有一种变态的函数设计语言,其语法定义如下:
1. 任何内容都是以函数级联的表达式构成,例如1+2*3表示为 +(1, *(2, 3) ) ;
2. 使用函数名调用函数:foo(1, 2, 3),默认提供的操作符函数有:
+、-、*、/、==、>、>=、<、<=  ;
3. 无名的函数调用依次执行每一个参数,并返回最后一个参数。例如:(1, 2, 3) 返回3;
4. 提供var保留字函数,用来定义变量并做初始化,变量可在后续使用。例如:var(i, 1) 表示定义变量i,并初始化值为1;
5. 提供set保留字函数,用来给一个变量赋值,并返回变量值,例如:(var(i, 1), set(i, 3)) 表示定义变量i,并对i设置值为3,最后返回的是值为3;
6. 条件函数if:if ( 条件, 真部,假部 )。例如:if (==(i, 1), 10, 0),表示当i为1时结果为10;
7. 循环语句while的定义为:while ( 条件,循环体 ) ;
8. 循环语句do...while的定义为:do ( 循环体,条件 ) ;
9. 函数定义采用“函数名(参数表) := 函数体”的方式,函数返回值即为函数体的结果, 例如定义函数testFuncAdd:testFuncAdd(a, b) := (+(a, b))  ;
10. 代码注释语法和C/C++/Java相同,空格和换行不破坏代码结构。要求:
1) 请用上述语法实现一个斐波那契数列(Fibonacci number)的计算函数,要求必须使用非递归方式实现(代码给出必要的的注释和合理换行);
2) 请利用本函数语言再次实现第一题(求整数区间交集),可根据需要自定一到两条新的语法,并说明理由;
3) 如果我们去掉第“5”条语法,那么这个时候这个函数语言会变得更有趣,请说明这个时候这个函数语言的特点,和编程方式的改变。

解决方案 »

  1.   


    int[] arr = new int[20];
    arr[0] = arr[1] = 1;
    for (int i = 2; i < arr.length; i++)
            arr[i] = arr[i - 1] + arr[i - 2];
    for (int i = 0; i < arr.length; i++)
            System.out.print(arr[i] + " ");想想怎么把这个按上面定义的 来翻译...
      

  2.   


    Fibonacci(n):=
    (
    var(a1,1),
    var(a2,1),
    var(a3,1),
    while(
    (set(n,n-1)>=2), //条件,n<3时,直接返回a3,
    (
    set(a3,+(a1+a2)),
    set(a1,a2),
    set(a2,a3)
    )
    ),
    a3
    )
    由以下代码翻译...int Fibonacci(int n)
    {
    int a1=1;
    int a2=1;
    int a3;
    for(int i=3;i<=n;++i)
    {
    a3=a1+a2;
    a1=a2;
    a2=a3;
    }
    return a3;
    }
      

  3.   

    第一问,因为没有数组之类的数据结构可以使用,只能简单的获得斐波那契数列某一位的值fibonacciNumber(i) := 
    (
    var(count,2),
    var(result,1),
    var(last,1),
    while(>(i, count), 
    (
    var(temp, result),
    set(result, +(result, last)),
    set(last, temp),
    set(count, +(count, 1)), 
    )),
    result,
    )
    下面是验算的java代码public static int fibonacciNumber (int i) {
    int count = 2;
    int result = 1;
    int last = 1;

    while (i > count) {
    int temp = result;
    result = result + last;
    last = temp;

    count = count + 1;
    }

    return result;
    }
      

  4.   

    sorry  没怎么看懂呵呵 
      

  5.   

    2、第一条新语法  ,定义数组的函数为set(array,{1,2,3,4,5,6})  前面为数组的名称,后面为数组的内容,要取得数字的内容只需要这样取..array[1] ,表示取得数组的第二个元素。元素下标值从零开始
       第二条新语法  ,if条件里面可以加逻辑判断符号 || && 等等
       jiaoji(start0,end0,start1,end1):=  
    (  var(result,0),
     set(
    result,
    if(>(start0,start1) || >(end0,end1),
    set(array,{0}),  //没有交集
    set(
    array,
    {
    if(>=(start0,start1),start0,start1),
    if(<=(end0,end1),end0,end1)
    }
    )
    )
    )
    )
       调用 : (var(array,{0}),set(array,FibonacciNumber({1,2,3,4,5}[0],{1,2,3,4}[3]),{3,4,5}[0],{3,4,5}[2]))  //求1-5 和1-4的交集 返回数组array