看到两道小学数学题,实在是解不动,用js写了一下

把一个自然数的约数(除去它本身)按照从小到大的顺序写在它的左边,可以得到一个多位数,比如6的约数是1,2,3,写成一个多位数是1236,假如这个多位数中,没有直复数字,那么我们你这个多位数是唯一的。请问,从1-999中,有多少个唯一的多位数,(一位数不是多位数,不作考虑)

let total=0;
for(let i=1;i<=999;i++){
    let str='';
    for(let j=1;j<=i;j++){
        if(i%j===0){
            str+= ''+j;
        }
    }
    str=str.split('');
    let newStr=[...new Set(str)];
    if(str.length>1&&newStr.length===str.length){
        total++;
    }
}
console.log(total);//83

把1-6排成一排,然后把相邻两个数作差(大数减去小数),把这落差都加起来,最后结果是偶数的排法有种、(比如按照123465排,差就是11121,1+1+1-2+1=6,是偶数,就是一种满足条件的排法)

看错题目,以为1-6可以重复排列:

let total=0;
function b(str){
    let newStr='';
    for(let i=1;i<=6;i++){
        newStr=str+i;
        if(newStr.length<6){
            b(newStr);
        }else{
            let sum=0;
            for(let j=0;j<newStr.length-1;j++){
                sum+=newStr[j]>newStr[j+1]?newStr[j]-newStr[j+1]:newStr[j+1]-newStr[j];
            }
            if(sum%2===0){
                total++;
            }
        }
    }
}
b('')
console.log(total);//23328

正解如下:

let total=0;
const arr=[1,2,3,4,5,6];
function b(arr,newArr){
    for(let i=0;i<arr.length;i++){
        let tempArr=[...arr];
        let tempNewArr=[...newArr];
        tempNewArr=tempNewArr.concat(tempArr.splice(i,1));
        if(tempNewArr.length<6){
            b(tempArr,tempNewArr)
        }else{
            // console.log(tempNewArr);
            let sum=0;
            for(let j=0;j<tempNewArr.length-1;j++){
                sum+=tempNewArr[j]>tempNewArr[j+1]?tempNewArr[j]-tempNewArr[j+1]:tempNewArr[j+1]-tempNewArr[j];
            }
            if(sum%2===0){
                total++;
            }
        }
    }
}
b(arr,[]);
console.log(total);//288

虽然是小学的题目,现在确实也解不动了,算法很简单,但是在处理递归的时候还是出现了一些问题,让自己陷入泥潭。
其实自己之前写递归写得还是太少,递归确实很好用,但是很神秘,不好实现(主要还是写的太少)。经过反思,得出一个写递归的必要条件(算是一点点小的心得吧):当确定要使用递归时,先不要去考虑递归调用的问题,只考虑第一次的实现方式,先把第一次实现了,再去递归。

posted @ 2019-09-20 14:17  易言  阅读(268)  评论(0)    收藏  举报