日期:2014-05-20  浏览次数:20630 次

某知名公司的超变态笔试题。高手们来看看呗!!
假设有一种变态的函数设计语言,其语法定义如下:
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”条语法,那么这个时候这个函数语言会变得更有趣,请说明这个时候这个函数语言的特点,和编程方式的改变。


------解决方案--------------------
Java code

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] + " ");

------解决方案--------------------
C# code

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
)

------解决方案--------------------
第一问,因为没有数组之类的数据结构可以使用,只能简单的获得斐波那契数列某一位的值
Java code

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,
)

------解决方案--------------------
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