问题:这次我们要使用函数编写计算并获得结果。让我们看一些例子:
seven(times(five())); // must return 35
four(plus(nine())); // must return 13
eight(minus(three())); // must return 5
six(dividedBy(two())); // must return 3
要求:
每个数字必须有一个函数,范围从0(“零”)到9(“ 9”)
以下每个数学运算必须具有一个函数:加,减,乘,除(divided_by在Ruby和Python中)
每次计算均由一个操作和两个数字组成
最外层的函数代表左操作数,最内层的函数代表右操作数
除法应该是整数除法。例如,应返回2,而不是2.666666…:
思路:要给每个数字方法加个是否传值的判断,有值就进行计算,没有就返回值
function zero(x) {
if (!x) {
return 0
} else {
var z = x.split(',')
if (z[0] == '+') {
return 0 + Number(z[1])
} else if (z[0] == '-') {
return 0 - Number(z[1])
} else if (z[0] == '*') {
return 0 * Number(z[1])
} else if (z[0] == '/') {
return Math.floor(0 / Number(z[1]))
}
}
}
function one(x) {
if (!x) {
return 1
} else {
var z = x.split(',')
if (z[0] == '+') {
return 1 + Number(z[1])
} else if (z[0] == '-') {
return 1 - Number(z[1])
} else if (z[0] == '*') {
return 1 * Number(z[1])
} else if (z[0] == '/') {
return Math.floor(1 / Number(z[1]))
}
}
}
function two(x) {
if (!x) {
return 2
} else {
var z = x.split(',')
if (z[0] == '+') {
return 2 + Number(z[1])
} else if (z[0] == '-') {
return 2 - Number(z[1])
} else if (z[0] == '*') {
return 2 * Number(z[1])
} else if (z[0] == '/') {
return Math.floor(2 / Number(z[1]))
}
}
}
function three(x) {
if (!x) {
return 3
} else {
var z = x.split(',')
if (z[0] == '+') {
return 3 + Number(z[1])
} else if (z[0] == '-') {
return 3 - Number(z[1])
} else if (z[0] == '*') {
return 3 * Number(z[1])
} else if (z[0] == '/') {
return Math.floor(3 / Number(z[1]))
}
}
}
function four(x) {
if (!x) {
return 4
} else {
var z = x.split(',')
if (z[0] == '+') {
return 4 + Number(z[1])
} else if (z[0] == '-') {
return 4 - Number(z[1])
} else if (z[0] == '*') {
return 4 * Number(z[1])
} else if (z[0] == '/') {
return Math.floor(4 / Number(z[1]))
}
}
}
function five(x) {
if (!x) {
return 5
} else {
var z = x.split(',')
if (z[0] == '+') {
return 5 + Number(z[1])
} else if (z[0] == '-') {
return 5 - Number(z[1])
} else if (z[0] == '*') {
return 5 * Number(z[1])
} else if (z[0] == '/') {
return Math.floor(5 / Number(z[1]))
}
}
}
function six(x) {
if (!x) {
return 6
} else {
var z = x.split(',')
if (z[0] == '+') {
return 6 + Number(z[1])
} else if (z[0] == '-') {
return 6 - Number(z[1])
} else if (z[0] == '*') {
return 6 * Number(z[1])
} else if (z[0] == '/') {
return Math.floor(6 / Number(z[1]))
}
}
}
function seven(x) {
if (!x) {
return 7
} else {
var z = x.split(',')
if (z[0] == '+') {
return 7 + Number(z[1])
} else if (z[0] == '-') {
return 7 - Number(z[1])
} else if (z[0] == '*') {
return 7 * Number(z[1])
} else if (z[0] == '/') {
return Math.floor(7 / Number(z[1]))
}
}
}
function eight(x) {
if (!x) {
return 8
} else {
var z = x.split(',')
if (z[0] == '+') {
return 8 + Number(z[1])
} else if (z[0] == '-') {
return 8 - Number(z[1])
} else if (z[0] == '*') {
return 8 * Number(z[1])
} else if (z[0] == '/') {
return Math.floor(8 / Number(z[1]))
}
}
}
function nine(x) {
if (!x) {
return 9
} else {
var z = x.split(',')
if (z[0] == '+') {
return 9 + Number(z[1])
} else if (z[0] == '-') {
return 9 - Number(z[1])
} else if (z[0] == '*') {
return 9 * Number(z[1])
} else if (z[0] == '/') {
return Math.floor(9 / Number(z[1]))
}
}
}
function plus(x) {
return '+,'+x
}
function minus(x) {
return '-,'+x
}
function times(x) {
return '*,'+x
}
function dividedBy(x) {
return '/,'+x
}
但是这样很麻烦,数字方法基本都是在重复,可以提取一下
var n = function(digit) {
console.log('1111',digit)
return function(op) {
console.log('000',op)
return op ? op(digit) : digit;
}
};
var zero = n(0);
var one = n(1);
var two = n(2);
var three = n(3);
var four = n(4);
var five = n(5);
var six = n(6);
var seven = n(7);
var eight = n(8);
var nine = n(9);
function plus(r) { return function(l) { return l + r; }; }
function minus(r) { return function(l) { return l - r; }; }
function times(r) { return function(l) { return l * r; }; }
function dividedBy(r) { return function(l) { return Math.floor(l / r); }; }