假设有一种变态的函数设计语言,其语法定义如下:
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. 任何内容都是以函数级联的表达式构成,例如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”条语法,那么这个时候这个函数语言会变得更有趣,请说明这个时候这个函数语言的特点,和编程方式的改变。
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] + " ");想想怎么把这个按上面定义的 来翻译...
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;
}
(
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;
}
第二条新语法 ,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