JavaScript એરેમાંથી બાઈનરી સર્ચ ટ્રી બનાવવી

Binary Search Tree

એરે સાથે બાઈનરી શોધ વૃક્ષ બાંધકામ

દ્વિસંગી શોધ વૃક્ષો (BSTs) એ કોમ્પ્યુટર વિજ્ઞાનમાં મૂળભૂત ડેટા માળખું છે, જે કાર્યક્ષમ શોધ, નિવેશ અને તત્વોને કાઢી નાખવા સક્ષમ બનાવે છે. એરેમાંથી BST બનાવતી વખતે, BST ગુણધર્મો જાળવવા માટે એરેને કેવી રીતે વિભાજિત કરવું તે સમજવામાં મુખ્ય છે. આમાં પસંદ કરેલ રૂટ મૂલ્યના આધારે એરેને ડાબે અને જમણા સબરેમાં વિભાજીત કરવાનો સમાવેશ થાય છે.

આ લેખમાં, અમે JavaScript નો ઉપયોગ કરીને એરેમાંથી BST બનાવવાની પ્રક્રિયામાંથી પસાર થઈશું. ઉદ્દેશ્ય એરેમાંથી રુટ પસંદ કરવાનો છે, તત્વોને ડાબે અને જમણા પેટા વૃક્ષોમાં વિભાજિત કરવાનો છે, અને જ્યાં સુધી બધા તત્વો વૃક્ષમાં યોગ્ય રીતે ગોઠવાઈ ન જાય ત્યાં સુધી દરેક પેટા વૃક્ષ માટે આ પ્રક્રિયાને વારંવાર પુનરાવર્તન કરો.

અલ્ગોરિધમને વિભાજનને સાવચેતીપૂર્વક સંભાળવાની જરૂર છે, ખાસ કરીને જ્યારે માત્ર બે ઘટકો બાકી હોય, કારણ કે નીચું મૂલ્ય ડાબી બાજુએ જવું જોઈએ અને ઉચ્ચ મૂલ્ય જમણી તરફ. વધુમાં, પુનરાવર્તિત તર્ક એરેને નાના ભાગોમાં વિભાજીત કરવામાં મદદ કરે છે, ખાતરી કરે છે કે વૃક્ષ યોગ્ય રીતે બનેલ છે.

આ અભિગમ અમને સંતુલિત BST કાર્યક્ષમ રીતે બનાવવાની મંજૂરી આપે છે, જો એરે સૉર્ટ કરેલ હોય. દર્શાવેલ પગલાંને અનુસરીને, તમે JavaScript માં કાર્યકારી BST ને અમલમાં મૂકી શકશો, સામાન્ય સમસ્યાઓ જેમ કે ડેટા દ્વારા કાર્યક્ષમ રીતે શોધવી અથવા સૉર્ટ કરેલ ડેટાને ગતિશીલ રીતે જાળવવા જેવી સામાન્ય સમસ્યાઓ હલ કરી શકશો.

આદેશ ઉપયોગનું ઉદાહરણ
Math.floor() આ આદેશનો ઉપયોગ નીચે રાઉન્ડ કરીને એરેના મધ્યબિંદુની ગણતરી કરવા માટે થાય છે. દ્વિસંગી શોધ વૃક્ષ બાંધકામમાં પેટા વૃક્ષનું મૂળ શોધવા માટે તે નિર્ણાયક છે. ઉદાહરણ: let mid = Math.floor(nums.length / 2);
Array.prototype.slice() આ પદ્ધતિનો ઉપયોગ મધ્યબિંદુના આધારે એરેને ડાબે અને જમણા સબરેમાં વિભાજિત કરવા માટે થાય છે. તે પુનરાવર્તિત BST નિર્માણ માટે એરેને નાના ભાગોમાં વિભાજીત કરવામાં મદદ કરે છે. ઉદાહરણ: let lSide = nums.slice(0, mid);
Array.prototype.push() તત્વોને એરે અથવા કતારમાં ધકેલે છે, જે પ્રક્રિયા કરવા માટે નવા નોડ્સ ઉમેરતી વખતે પુનરાવર્તિત અભિગમ માટે જરૂરી છે. ઉદાહરણ: queue.push({ node: node.left, range: leftSide });
throw new Error() આ આદેશનો ઉપયોગ એરર હેન્ડલિંગ માટે થાય છે. તે ખાતરી કરે છે કે પ્રોગ્રામ અમાન્ય ઇનપુટ્સ સાથે ચાલુ રહેતો નથી. ઉદાહરણ: નવી ભૂલ ફેંકો("અમાન્ય ઇનપુટ: સંખ્યાઓ ખાલી ન હોવા જોઈએ.");
Array.isArray() તપાસે છે કે શું ઇનપુટ માન્ય એરે છે. વૃક્ષ બાંધકામ દરમિયાન સંભવિત ભૂલોને ટાળવા માટે આ આદેશ ઇનપુટ માન્યતા માટે ઉપયોગી છે. ઉદાહરણ: જો (!Array.isArray(nums))
console.error() ડિબગીંગ હેતુઓ માટે કન્સોલ પર ભૂલ સંદેશાઓ લોગ કરે છે. તે પ્રોગ્રામના અમલ દરમિયાન સમસ્યાઓને ટ્રેક કરવામાં મદદ કરે છે. ઉદાહરણ: console.error(error.message);
Node() આ કન્સ્ટ્રક્ટર ફંક્શન આપેલ મૂલ્ય સાથે બાઈનરી સર્ચ ટ્રીમાં એક નવો નોડ બનાવે છે. તે વૃક્ષનું માળખું બનાવવા માટેનો પાયો છે. ઉદાહરણ: let node = new Node(nums[mid]);
while() શરત પૂરી ન થાય ત્યાં સુધી તત્વો પર લૂપ કરવા માટે વપરાય છે. પુનરાવર્તિત અભિગમમાં, આ લૂપ ખાતરી કરે છે કે તમામ ગાંઠો કતારમાં પ્રક્રિયા કરવામાં આવે છે. ઉદાહરણ: જ્યારે (queue.length) { ... }
try { ... } catch { ... } આ સ્ટ્રક્ચરનો ઉપયોગ અપવાદોને હેન્ડલ કરવા માટે થાય છે, જો કોઈ ભૂલ થાય, તો પ્રોગ્રામ તેને ક્રેશ થયા વિના મેનેજ કરી શકે છે. ઉદાહરણ: પ્રયાસ કરો { ... } પકડો (ભૂલ) { ... }

JavaScript માં બાઈનરી સર્ચ ટ્રી કન્સ્ટ્રક્શનને સમજવું

અમે અન્વેષણ કરેલ પ્રથમ સ્ક્રિપ્ટ બિલ્ડ્સ a પુનરાવર્તિત અભિગમનો ઉપયોગ કરીને. આ પદ્ધતિ સમસ્યાઓ ઉકેલવા માટે ઉપયોગી છે જ્યાં ડેટાને નાની પેટા સમસ્યાઓમાં વિભાજીત કરવાની જરૂર છે. એરેનું મધ્યમ તત્વ શોધીને, આપણે તેને વૃક્ષના રૂટ નોડ તરીકે પસંદ કરી શકીએ છીએ. એરેની ડાબી બાજુ, જેમાં રુટ કરતા નાના તત્વો હોય છે, તે ડાબી બાજુનું સબટ્રી બને છે, જ્યારે જમણી બાજુ, મોટા તત્વો સાથે, જમણી બાજુનું સબટ્રી બને છે. આ પ્રક્રિયા પુનરાવર્તિત રીતે પુનરાવર્તિત થાય છે જ્યાં સુધી બધા તત્વો વૃક્ષમાં દાખલ ન થાય.

પુનરાવર્તન એલ્ગોરિધમના સ્વચ્છ અને તાર્કિક પ્રવાહ માટે પરવાનગી આપે છે. આ સ્ક્રિપ્ટમાં મુખ્ય આદેશ છે , જેનો ઉપયોગ એરેના મધ્યબિંદુની ગણતરી કરવા માટે થાય છે અને આગળની પ્રક્રિયા માટે તેને વિભાજિત કરવામાં મદદ કરે છે. બીજો મહત્વનો આદેશ છે , જે એરેને બે ભાગમાં વિભાજિત કરે છે, જે આપણને ડાબી અને જમણી સબટ્રીઝને વારંવાર બનાવવાની મંજૂરી આપે છે. આ મોડ્યુલર અભિગમ સુનિશ્ચિત કરે છે કે BST તેની સૉર્ટ કરેલ માળખું જાળવી રાખીને યોગ્ય રીતે રચાયેલ છે. આ પુનરાવર્તિત વ્યૂહરચના બાંયધરી આપે છે કે વૃક્ષ સંતુલિત છે, જો એરે સૉર્ટ કરેલ હોય.

બીજી સ્ક્રિપ્ટમાં, અમે કતારનો ઉપયોગ કરીને પુનરાવર્તિત અભિગમનો અમલ કર્યો. આ પદ્ધતિ લાભદાયી છે જ્યારે પુનરાવર્તન કાં તો ખૂબ જટિલ હોય અથવા મેમરી અવરોધોને કારણે પસંદ ન કરવામાં આવે. મુખ્ય વિચાર એ જ રહે છે: મધ્યબિંદુ શોધવું, નોડ દાખલ કરવું અને એરેને નાના ભાગોમાં વિભાજીત કરવું. જો કે, પુનરાવર્તિત થવાને બદલે, અમે નોડ્સ સ્ટોર કરવા માટે કતારનો ઉપયોગ કરીએ છીએ જેને પ્રક્રિયા કરવાની જરૂર છે. આ પુનરાવર્તિત ઉકેલ જેમ કે આદેશોનો ઉપયોગ કરે છે , જે ભાવિ પ્રક્રિયા માટે કતારમાં નોડ્સ ઉમેરે છે. જ્યારે તમામ ગાંઠો પર પ્રક્રિયા કરવામાં ન આવે ત્યાં સુધી લૂપ ચાલુ રહે છે, તેની ખાતરી કરીને કે સમગ્ર વૃક્ષનું નિર્માણ કરવામાં આવ્યું છે.

છેલ્લે, ત્રીજી સ્ક્રિપ્ટ એરર હેન્ડલિંગ અને ઇનપુટ માન્યતા રજૂ કરે છે. જેવા આદેશોનો ઉપયોગ કરીને અને , અમે વૃક્ષના બાંધકામ સાથે આગળ વધતા પહેલા અમાન્ય ઇનપુટ્સ માટે તપાસ કરીને કોડને વધુ મજબૂત બનાવીએ છીએ. આ તપાસ સુનિશ્ચિત કરે છે કે અમારું બાઈનરી સર્ચ ટ્રી ફક્ત ત્યારે જ બનેલ છે જો ઇનપુટ માન્ય હોય, રનટાઇમ ભૂલોને અટકાવે છે. આ સંસ્કરણ અપવાદોને આકર્ષક રીતે હેન્ડલ કરવા માટે ટ્રાય-કેચ બ્લોક પણ લાગુ કરે છે, જે પ્રોગ્રામને ભૂલોનું સંચાલન કરવા અને તેમને યોગ્ય રીતે લૉગ કરવાની મંજૂરી આપે છે. આ માત્ર સોલ્યુશનની વિશ્વસનીયતામાં સુધારો કરે છે પરંતુ તેની સુરક્ષા અને કાર્યક્ષમતામાં પણ વધારો કરે છે, તે સુનિશ્ચિત કરે છે કે તે વિવિધ વાતાવરણમાં યોગ્ય રીતે કાર્ય કરે છે.

રિકર્ઝનનો ઉપયોગ કરીને બાઈનરી સર્ચ ટ્રી કન્સ્ટ્રક્શન

આ સોલ્યુશન જાવાસ્ક્રિપ્ટમાં પુનરાવર્તિત અભિગમનો ઉપયોગ કરીને એરેમાંથી બાઈનરી સર્ચ ટ્રી બનાવે છે.

class Node {
  constructor(value) {
    this.value = value;
    this.left = null;
    this.right = null;
  }
}
class BinarySearchTree {
  constructor() {
    this.root = null;
  }
  buildTree(nums) {
    if (nums.length === 0) return null;
    let mid = Math.floor(nums.length / 2);
    let node = new Node(nums[mid]);
    node.left = this.buildTree(nums.slice(0, mid));
    node.right = this.buildTree(nums.slice(mid + 1));
    return node;
  }
}
const nums = [1, 2, 3, 4, 5, 6, 7];
const bst = new BinarySearchTree();
bst.root = bst.buildTree(nums);
console.log(bst.root);

પુનરાવૃત્તિ અને કતારનો ઉપયોગ કરીને દ્વિસંગી શોધ વૃક્ષ

આ સોલ્યુશન કતાર સાથે પુનરાવર્તિત અભિગમનો ઉપયોગ કરીને દ્વિસંગી શોધ વૃક્ષ બનાવે છે.

class Node {
  constructor(value) {
    this.value = value;
    this.left = null;
    this.right = null;
  }
}
class BinarySearchTree {
  constructor() {
    this.root = null;
  }
  buildTree(nums) {
    if (nums.length === 0) return null;
    let mid = Math.floor(nums.length / 2);
    this.root = new Node(nums[mid]);
    let queue = [{ node: this.root, range: nums }];
    while (queue.length) {
      let { node, range } = queue.shift();
      let midIndex = Math.floor(range.length / 2);
      let leftSide = range.slice(0, midIndex);
      let rightSide = range.slice(midIndex + 1);
      if (leftSide.length) {
        node.left = new Node(leftSide[Math.floor(leftSide.length / 2)]);
        queue.push({ node: node.left, range: leftSide });
      }
      if (rightSide.length) {
        node.right = new Node(rightSide[Math.floor(rightSide.length / 2)]);
        queue.push({ node: node.right, range: rightSide });
      }
    }
  }
}
const nums = [1, 2, 3, 4, 5, 6, 7];
const bst = new BinarySearchTree();
bst.buildTree(nums);
console.log(bst.root);

ભૂલ હેન્ડલિંગ અને ઇનપુટ માન્યતા સાથે સંતુલિત બાઈનરી શોધ વૃક્ષ

આ સોલ્યુશન ઇનપુટ માન્યતા અને ઑપ્ટિમાઇઝ એરર હેન્ડલિંગ સાથે પુનરાવર્તિત અભિગમ પર સુધારે છે.

class Node {
  constructor(value) {
    this.value = value;
    this.left = null;
    this.right = null;
  }
}
class BinarySearchTree {
  constructor() {
    this.root = null;
  }
  buildTree(nums) {
    if (!Array.isArray(nums) || nums.length === 0) {
      throw new Error("Invalid input: nums must be a non-empty array.");
    }
    return this._buildRecursive(nums);
  }
  _buildRecursive(nums) {
    if (nums.length === 0) return null;
    let mid = Math.floor(nums.length / 2);
    let node = new Node(nums[mid]);
    node.left = this._buildRecursive(nums.slice(0, mid));
    node.right = this._buildRecursive(nums.slice(mid + 1));
    return node;
  }
}
try {
  const nums = [1, 2, 3, 4, 5, 6, 7];
  const bst = new BinarySearchTree();
  bst.root = bst.buildTree(nums);
  console.log(bst.root);
} catch (error) {
  console.error(error.message);
}

કાર્યક્ષમ દ્વિસંગી શોધ વૃક્ષ અલ્ગોરિધમ્સ

બાઈનરી સર્ચ ટ્રી (BST) એલ્ગોરિધમનું એક મહત્વનું પાસું છે . વૃક્ષ શ્રેષ્ઠ શોધ સમય જાળવે તેની ખાતરી કરવા માટે સંતુલન મહત્વપૂર્ણ છે. જો BST અસંતુલિત બને છે, તો નોડ્સ શોધવા, દાખલ કરવા અને કાઢી નાખવા જેવી કેટલીક કામગીરી રેખીય સમયની જટિલતા (O(n)) માં અધોગતિ કરી શકે છે, જે BST નો ઉપયોગ કરવાના હેતુને નષ્ટ કરે છે. AVL ટ્રી અને રેડ-બ્લેક ટ્રી જેવા એલ્ગોરિધમ્સ આપમેળે ગાંઠો દાખલ કરવા અથવા કાઢી નાખવા પર વૃક્ષને પુનઃસંતુલિત કરે છે, તે સુનિશ્ચિત કરે છે કે વૃક્ષની ઊંચાઈ હંમેશા નોડ્સની સંખ્યાને અનુરૂપ લઘુગણક છે.

બીએસટી બનાવતી વખતે બીજી મહત્ત્વની બાબત એ છે કે ડુપ્લિકેટ મૂલ્યોને કેવી રીતે હેન્ડલ કરવું. ઘણા કિસ્સાઓમાં, ડુપ્લિકેટ્સને ક્યાં તો નામંજૂર કરવામાં આવે છે અથવા તેને ડાબે અથવા જમણા સબટ્રીમાં સતત મૂકીને નિયંત્રિત કરવામાં આવે છે. ઉદાહરણ તરીકે, BST ની અખંડિતતા જાળવવા માટે ડિફોલ્ટ રૂપે જમણી સબટ્રી પર ડુપ્લિકેટ્સ મૂકી શકાય છે. ડુપ્લિકેટનું યોગ્ય રીતે સંચાલન કરવાથી બાંધકામના તબક્કા અને ત્યારબાદની કામગીરી બંને દરમિયાન વૃક્ષની કાર્યક્ષમતા અને કામગીરીને અસર થઈ શકે છે.

તદુપરાંત, તમારું BST તમામ સંજોગોમાં યોગ્ય રીતે કાર્ય કરે છે તેની ખાતરી કરવા માટે એરર હેન્ડલિંગ અને ઇનપુટ માન્યતા મહત્વપૂર્ણ છે. દાખલા તરીકે, ઇનપુટ એરે સૉર્ટ થયેલ છે કે કેમ તે તપાસવાથી સમય બચી શકે છે અને ખોટી ટ્રી સ્ટ્રક્ચર અટકાવી શકાય છે. મજબૂત ભૂલ હેન્ડલિંગ, જેમ કે અર્થપૂર્ણ ભૂલ સંદેશાઓ ફેંકવા, રનટાઇમ સમસ્યાઓ ટાળવામાં મદદ કરે છે અને વિકાસકર્તાને વધુ કાર્યક્ષમ રીતે ડીબગ કરવાની મંજૂરી આપે છે. વધુમાં, રક્ષણાત્મક પ્રોગ્રામિંગ પ્રેક્ટિસનો સમાવેશ એ સુનિશ્ચિત કરે છે કે અમાન્ય અથવા અનપેક્ષિત ઇનપુટ વૃક્ષ-નિર્માણ પ્રક્રિયાને નિષ્ફળ થવાનું કારણ નથી.

  1. રિકર્ઝન BST બનાવવામાં કેવી રીતે મદદ કરે છે?
  2. રિકર્ઝન એરેને નાના સબએરેમાં વિભાજિત કરે છે અને મધ્ય તત્વને રુટ તરીકે સોંપે છે, એક પ્રક્રિયા જ્યાં સુધી બધા તત્વો મૂકવામાં ન આવે ત્યાં સુધી પુનરાવર્તિત થાય છે.
  3. તમે બાઈનરી સર્ચ ટ્રીમાં ડુપ્લિકેટ મૂલ્યોને કેવી રીતે હેન્ડલ કરશો?
  4. તમે ડાબી કે જમણી સબટ્રીમાં સતત ડુપ્લિકેટ્સ મૂકી શકો છો. આ ખાતરી કરે છે કે BST ગુણધર્મો જાળવવામાં આવે છે.
  5. નું મહત્વ શું છે BST બાંધકામમાં?
  6. એરેના મધ્યમ તત્વને નક્કી કરવામાં મદદ કરે છે, જે સબટ્રીનું મૂળ બને છે.
  7. BSTમાં વૃક્ષનું સંતુલન શા માટે મહત્વનું છે?
  8. સંતુલન વૃક્ષને ત્રાંસી બનતા અટકાવે છે, તે સુનિશ્ચિત કરે છે કે શોધવા, દાખલ કરવા અને કાઢી નાખવા જેવી કામગીરીમાં O(log n) સમય લાગે છે.
  9. કેવી રીતે કરી શકે છે વૃક્ષ બાંધકામ સુધારવા?
  10. એરેને ડાબે અને જમણા સબએરેમાં વિભાજિત કરવા માટે વપરાય છે, જે વૃક્ષના પેટા વૃક્ષોના પુનરાવર્તિત બાંધકામને મંજૂરી આપે છે.
  11. ઇનપુટ માન્યતામાં શું તપાસવું જોઈએ?
  12. તપાસો કે શું ઇનપુટ માન્ય, સૉર્ટ કરેલ એરે છે. આ ખાતરી કરે છે કે વૃક્ષ ભૂલો વિના યોગ્ય રીતે બાંધવામાં આવી શકે છે.
  13. BST બાંધકામમાં એરર હેન્ડલિંગ શું ભૂમિકા ભજવે છે?
  14. હેન્ડલિંગમાં ભૂલ, જેમ કે ઉપયોગ , સમસ્યાઓને વહેલી ઓળખવામાં મદદ કરે છે અને એપ્લિકેશનને ક્રેશ થવાથી અટકાવે છે.
  15. શા માટે તમે રિકર્ઝન પર પુનરાવર્તિત અભિગમ પસંદ કરી શકો છો?
  16. પુનરાવર્તન, એનો ઉપયોગ કરીને , પુનરાવર્તિત ઊંડાઈ સાથે સંભવિત સમસ્યાઓને ટાળે છે, ખાસ કરીને મોટા ડેટાસેટ્સમાં જ્યાં સ્ટેક ઓવરફ્લો થઈ શકે છે.
  17. AVL અને રેડ-બ્લેક વૃક્ષો કેવી રીતે સંતુલન જાળવી શકે છે?
  18. આ અલ્ગોરિધમ્સ લોગરીધમિક શોધ સમયની ખાતરી કરવા માટે દરેક નિવેશ અથવા કાઢી નાખવા પછી વૃક્ષને આપમેળે ફરીથી સંતુલિત કરે છે.
  19. મધ્ય તત્વને મૂળ તરીકે પસંદ કરવાનું શું મહત્વ છે?
  20. મધ્યમ તત્વ પસંદ કરવાનું સુનિશ્ચિત કરે છે કે વૃક્ષ સંતુલિત રહે છે, બિનકાર્યક્ષમ શોધ પાથને અટકાવે છે.

એરેમાંથી બાઈનરી સર્ચ ટ્રી બનાવવા માટે એરેને સબએરેમાં વિભાજીત કરવાનો અને રુટ તરીકે મધ્યમ તત્વને સોંપવાનો સમાવેશ થાય છે. આ પ્રક્રિયા કાર્યક્ષમ અને સંતુલિત વૃક્ષની રચના જાળવવામાં મદદ કરે છે. ઝડપી શોધ, દાખલ અને કાઢી નાખવાની કામગીરી સુનિશ્ચિત કરવા માટે સંતુલિત વૃક્ષ મહત્વપૂર્ણ છે.

પુનરાવર્તિત અને પુનરાવર્તિત બંને અભિગમોનો ઉપયોગ કરીને, તમે તમારા અમલીકરણમાં સુગમતાની ખાતરી કરી શકો છો. એરર હેન્ડલિંગ અને ઇનપુટ માન્યતા અમલમાં મૂકવી એ રનટાઇમ ભૂલોને રોકવા માટે ચાવીરૂપ છે. આ વ્યૂહરચનાઓ દ્વિસંગી શોધ વૃક્ષના સફળ વિકાસ તરફ દોરી જાય છે જે કાર્યાત્મક અને વિશ્વસનીય બંને છે.

  1. દ્વિસંગી શોધ વૃક્ષોના સિદ્ધાંત અને તેમને એરેમાંથી કેવી રીતે બનાવવું તેના પર વિગતવાર વર્ણન કરે છે. આ સંસાધન કાર્યક્ષમ વૃક્ષ નિર્માણ માટે એરેને હેન્ડલ કરવા માટે વિગતવાર આંતરદૃષ્ટિ પ્રદાન કરે છે. GeeksforGeeks - દ્વિસંગી શોધ વૃક્ષ
  2. જાવાસ્ક્રિપ્ટ એરે પદ્ધતિઓ જેમ કે આવરી લે છે અને ટ્રી ડેટા સ્ટ્રક્ચર્સ બનાવતી વખતે પુનરાવર્તિત તર્કને અસરકારક રીતે કેવી રીતે અમલમાં મૂકવો. MDN વેબ દસ્તાવેજ - અરે સ્લાઇસ()
  3. અલ્ગોરિધમ કાર્યક્ષમતા સુધારવા પર ધ્યાન કેન્દ્રિત કરીને, બાઈનરી સર્ચ ટ્રી જેવા ડેટા સ્ટ્રક્ચર્સ બનાવવા માટે પુનરાવર્તિત અને પુનરાવર્તિત અભિગમોની વિભાવનાઓની ચર્ચા કરે છે. JavaScript ટ્યુટોરીયલ - પુનરાવર્તન