- 设计一个简单的红绿灯策略,比如红灯亮分别为console.log(“red”),要求按照红3s-黄1s-绿1s顺序不断循环展示
let time = new Date()
function button(color,time){
let p= new Promise(function(resolve,reject){
setTimeout( ()=> {
resolve("Timestamp:"+time+",Color:"+color)
},time)
})
return p
}
function flash() {
button("red",3000)
.then((v)=>{
console.log(v);
return button("yellow",3000)
}).then((v)=>{
console.log(v);
return button("green",1000)
}).then((v)=>{
console.log(v)
return flash() //或去掉此行,最后的调用改为setInterval(flash, 7000)
})
}
flash()
2.1 给定一个整数金额的整钱n,还有2,3,5元三种货币,计算出所有能凑出整钱的组合个数
function countMoney(total) {
if (total < 2) {
return 0;
}
let result = 0;
let maxAmount = total / 2;
for (let i = 0; i <= maxAmount; i++) {
for (let j = 0; j <= maxAmount; j++) {
for (let k = 0; k <= maxAmount; k++) {
let sum = i * 5 + j * 3 + k * 2;
if (sum === total) {
result++;
break;
} else if (sum > total) {
break;
}
}
}
}
return result;
}
console.log(countMoney(10));
2.2 假如这个能使用的货币列表是给定的,意思是输入一个整数list,比如[1,2,3,5],还有金额n,求出所有组合数
整体思路用递归,function countMoney(amount, moneyArr),amount为剩下的金额,moneyArr为可以选择的货币列表,返回的是产生的组合数,那么初始条件认为amount = n, moneyArr = list(排序,由高往低)。取出当前moneyArr(也就是当前最大的面值)的货币first,剩下的货币可选面额叫做smallerMoneyArr,然后从0到first最大能取的个数开始(即 0 ~ amount / first),不断递归调用countMoney(remainingAmount, smallerMoneyArr),加起来所有组合数即可。
终止条件:如果剩余余额不为0但可选货币为空,那么分割方法失败,返回0;如果余额是0,那么分割成功,返回1
let inputMoneyArray=[1,2,3,5]
inputMoneyArray.sort().reverse()
function countMoney(amount,moneyArr) {
if (amount!=0 && moneyArr.length==0){
return 0
} else if (amount==0){
return 1
}
let first = moneyArr[0]
let smallerMoneyArr=[]
for (let i = 1; i < moneyArr.length; i++) {
smallerMoneyArr[i-1]=moneyArr[i]
}
let sum=0
for (let i=0;i<=amount/first;i++){
let remainingAmount=amount-(first*i)
sum+=countMoney(remainingAmount,smallerMoneyArr)
}return sum
}
let result=countMoney(5,inputMoneyArray)
console.log(result)