1. 程式人生 > >遞迴練習題目

遞迴練習題目

 練習題目

  1. 寫一個函式,接受一串字串,返回一個字串,這個字串是將原來字串倒過來。
  2. 寫一個函式,接受一串字串,同時從前後開始拿一位字元對比,如果兩個相等,返回 true,如果不等,返回 false
  3. 編寫一個函式,接受一個數組,返回扁平化新陣列。
  4. 編寫一個函式,接受一個物件,這個物件值是偶數,則讓它們相加,返回這個總值。
  5. 編寫一個函式,接受一個物件,返回一個數組,這個陣列包括物件裡所有的值是字串

 參考答案

參考1

function reverse(str) {
   if(str.length <= 1) return str; 
   return reverse(str.slice(1)) + str[0];
}

reverse('abc')
複製程式碼

參考2

function isPalindrome(str){ 
    if(str.length === 1) return true;
    if(str.length === 2) return str[0] === str[1]; 
    if(str[0] === str.slice(-1)) return isPalindrome(str.slice(1,-1)) 
    return false; 
}

var str = 'abba'
isPalindrome(str)
複製程式碼

參考3

function flatten (oldArr) {
   var newArr = [] 
   for(var i = 0; i < oldArr.length; i++){ 
    if(Array.isArray(oldArr[i])){ 
        newArr = newArr.concat(flatten(oldArr[i])) 
    } else { 
        newArr.push(oldArr[i])
     }
   }
   return newArr;
}

flatten([1,[2,[3,4]],5])
複製程式碼

參考4

function nestedEvenSum(obj, sum=0) {
    for (var key in obj) { 
        if (typeof obj[key] === 'object'){ 
            sum += nestedEvenSum(obj[key]); 
        } else if (typeof obj[key] === 'number' && obj[key] % 2 === 0){ 
            sum += obj[key]; 
        }
     } 
    
     return sum;
}

nestedEvenSum({c: 4,d: {a: 2, b:3}})
複製程式碼

參考5

function collectStrings(obj) {
    let newArr = []
    for (let key in obj) {
        if (typeof obj[key] === 'string') {
            newArr.push(obj[key])
        } else if(typeof obj[key] === 'object' && !Array.isArray(obj[key])) {
           newArr = newArr.concat(collectStrings(obj[key]))
        }
    }
    return newArr
}

var obj = {
        a: '1',
        b: {
            c: 2,
            d: 'dd'
        }
    }

collectStrings(obj)
複製程式碼

總結

遞迴精髓是,往往要先想好常規部分是怎樣的,在考慮遞迴部分,下面是 JavaScript 遞迴常用到的方法

  • 陣列:sliceconcat
  • 字串: slicesubstrsubstring
  • 物件:Object.assign