[{"data":1,"prerenderedAt":3216},["ShallowReactive",2],{"item-lessons-light-ch28-algorithms-searching-sorting-recursion":3,"item-examples-light-ch28-algorithms-searching-sorting-recursion":444,"item-exercises-light-ch28-algorithms-searching-sorting-recursion":753,"item-lesson-full-ch28-algorithms-searching-sorting-recursion-28.4":1070,"item-example-full-ch28-algorithms-searching-sorting-recursion-28.4":1703,"item-exercise-full-ch28-algorithms-searching-sorting-recursion-28.4":2305},[4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,196,200,204,208,212,216,220,224,228,232,236,240,244,248,252,256,260,264,268,272,276,280,284,288,292,296,300,304,308,312,316,320,324,328,332,336,340,344,348,352,356,360,364,368,372,376,380,384,388,392,396,400,404,408,412,416,420,424,428,432,436,440],{"path":5,"title":6,"stem":7},"\u002Fshockwave-curriculum\u002Flessons\u002Fch01-why-java-for-frc\u002F1-why-java-for-frc","Why Java for FRC?","shockwave-curriculum\u002Flessons\u002Fch01-why-java-for-frc\u002F1.1-why-java-for-frc",{"path":9,"title":10,"stem":11},"\u002Fshockwave-curriculum\u002Flessons\u002Fch01-why-java-for-frc\u002F2-intro-to-algorithms-programming-and-compilers","Intro to Algorithms, Programming and Compilers","shockwave-curriculum\u002Flessons\u002Fch01-why-java-for-frc\u002F1.2-intro-to-algorithms-programming-and-compilers",{"path":13,"title":14,"stem":15},"\u002Fshockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F1-variables-and-data-types","Variables & Data Types","shockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2.1-variables-and-data-types",{"path":17,"title":18,"stem":19},"\u002Fshockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2-expressions-and-output","Expressions & Output","shockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2.2-expressions-and-output",{"path":21,"title":22,"stem":23},"\u002Fshockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F3-assignment-and-input","Assignment & Input","shockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2.3-assignment-and-input",{"path":25,"title":26,"stem":27},"\u002Fshockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F4-casting-and-ranges-of-values","Casting & Ranges of Values","shockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2.4-casting-and-ranges-of-values",{"path":29,"title":30,"stem":31},"\u002Fshockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F5-compound-assignment-operators","Compound Assignment Operators","shockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2.5-compound-assignment-operators",{"path":33,"title":34,"stem":35},"\u002Fshockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F1-apis-and-libraries","APIs and Libraries","shockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F3.1-apis-and-libraries",{"path":37,"title":38,"stem":39},"\u002Fshockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F2-documentation-with-comments-and-preconditions","Documentation with Comments and Preconditions","shockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F3.2-documentation-with-comments-and-preconditions",{"path":41,"title":42,"stem":43},"\u002Fshockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F3-packages-and-imports","Packages & Imports","shockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F3.3-packages-and-imports",{"path":45,"title":46,"stem":47},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F1-methods-signatures-and-parameters","Methods, Signatures & Parameters","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.1-methods-signatures-and-parameters",{"path":49,"title":50,"stem":51},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F2-calling-class-methods","Calling Class Methods","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.2-calling-class-methods",{"path":53,"title":54,"stem":55},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F3-using-the-math-class","Using the Math Class","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.3-using-the-math-class",{"path":57,"title":58,"stem":59},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4-objects-instances-of-classes","Objects — Instances of Classes","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.4-objects-instances-of-classes",{"path":61,"title":62,"stem":63},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F5-creating-and-initializing-objects-constructors","Creating & Initializing Objects: Constructors","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.5-creating-and-initializing-objects-constructors",{"path":65,"title":66,"stem":67},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F6-calling-instance-methods","Calling Instance Methods","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.6-calling-instance-methods",{"path":69,"title":70,"stem":71},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F1-5.2-if-statements-and-for-loops","Control Structures: if Statements & For Loops","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.1-5.2-if-statements-and-for-loops",{"path":73,"title":74,"stem":75},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F10-nested-iteration","Nested Iteration","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.10-nested-iteration",{"path":77,"title":78,"stem":79},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F11-informal-runtime-analysis-of-loops","Informal Runtime Analysis of Loops","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.11-informal-runtime-analysis-of-loops",{"path":81,"title":82,"stem":83},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F12-switch-statements-and-expressions","switch Statements and Expressions","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.12-switch-statements-and-expressions",{"path":85,"title":86,"stem":87},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F3-algorithms-with-selection-and-repetition","Algorithms with Selection and Repetition","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.3-algorithms-with-selection-and-repetition",{"path":89,"title":90,"stem":91},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F4-boolean-expressions","Boolean Expressions","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.4-boolean-expressions",{"path":93,"title":94,"stem":95},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5-nested-if-statements","Nested if Statements","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.5-nested-if-statements",{"path":97,"title":98,"stem":99},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F6-compound-boolean-expressions","Compound Boolean Expressions","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.6-compound-boolean-expressions",{"path":101,"title":102,"stem":103},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F7-comparing-boolean-expressions-de-morgans-laws","Comparing Boolean Expressions (De Morgan's Laws)","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.7-comparing-boolean-expressions-de-morgans-laws",{"path":105,"title":106,"stem":107},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F8-while-loops","While Loops","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.8-while-loops",{"path":109,"title":110,"stem":111},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F9-implementing-selection-and-iteration-algorithms","Implementing Selection and Iteration Algorithms","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.9-implementing-selection-and-iteration-algorithms",{"path":113,"title":114,"stem":115},"\u002Fshockwave-curriculum\u002Flessons\u002Fch06-strings\u002F1-strings","Strings","shockwave-curriculum\u002Flessons\u002Fch06-strings\u002F6.1-strings",{"path":117,"title":118,"stem":119},"\u002Fshockwave-curriculum\u002Flessons\u002Fch06-strings\u002F2-string-algorithms","String Algorithms","shockwave-curriculum\u002Flessons\u002Fch06-strings\u002F6.2-string-algorithms",{"path":121,"title":122,"stem":123},"\u002Fshockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F1-anatomy-of-a-java-class","The Class Blueprint","shockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F7.1-anatomy-of-a-java-class",{"path":125,"title":126,"stem":127},"\u002Fshockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F2-methods-how-to-write-them","Methods: How to Write Them","shockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F7.2-methods-how-to-write-them",{"path":129,"title":130,"stem":131},"\u002Fshockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F3-methods-passing-and-returning-references-of-an-object","Methods: Passing & Returning References of an Object","shockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F7.3-methods-passing-and-returning-references-of-an-object",{"path":133,"title":134,"stem":135},"\u002Fshockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F4-class-static-variables-and-methods","Class (static) Variables & Methods","shockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F7.4-class-static-variables-and-methods",{"path":137,"title":138,"stem":139},"\u002Fshockwave-curriculum\u002Flessons\u002Fch08-constructors-and-this\u002F1-8.2-constructors-and-this","Constructors & \"this\"","shockwave-curriculum\u002Flessons\u002Fch08-constructors-and-this\u002F8.1-8.2-constructors-and-this",{"path":141,"title":142,"stem":143},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F1-array-creation-and-access","Array Creation and Access","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.1-array-creation-and-access",{"path":145,"title":146,"stem":147},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F2-arraylist-and-its-methods","ArrayList and its Methods","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.2-arraylist-and-its-methods",{"path":149,"title":150,"stem":151},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F3-optional-hashmap-dictionary-data-structure","HashMap (Dictionary) Data Structure","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.3-optional-hashmap-dictionary-data-structure",{"path":153,"title":154,"stem":155},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F4-array-traversals","Array Traversals","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.4-array-traversals",{"path":157,"title":158,"stem":159},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F5-implementing-array-algorithms","Implementing Array Algorithms","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.5-implementing-array-algorithms",{"path":161,"title":162,"stem":163},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F6-arraylist-traversals","ArrayList Traversals","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.6-arraylist-traversals",{"path":165,"title":166,"stem":167},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F7-implementing-arraylist-algorithms","Implementing ArrayList Algorithms","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.7-implementing-arraylist-algorithms",{"path":169,"title":170,"stem":171},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F8-using-text-files","Using Text Files","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.8-using-text-files",{"path":173,"title":174,"stem":175},"\u002Fshockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F1-2d-array-creation-and-access","2D Array Creation and Access","shockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F10.1-2d-array-creation-and-access",{"path":177,"title":178,"stem":179},"\u002Fshockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F2-2d-array-traversals-nested-loops","2D Array Traversals: Nested Loops","shockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F10.2-2d-array-traversals-nested-loops",{"path":181,"title":182,"stem":183},"\u002Fshockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F3-implementing-2d-array-algorithms","Implementing 2D Array Algorithms","shockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F10.3-implementing-2d-array-algorithms",{"path":185,"title":186,"stem":187},"\u002Fshockwave-curriculum\u002Flessons\u002Fch11-enums-named-choices\u002F11-enums-named-choices","Enums: Named Choices","shockwave-curriculum\u002Flessons\u002Fch11-enums-named-choices\u002F11-enums-named-choices",{"path":189,"title":190,"stem":191},"\u002Fshockwave-curriculum\u002Flessons\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch","Exceptions & try\u002Fcatch","shockwave-curriculum\u002Flessons\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch",{"path":193,"title":194,"stem":195},"\u002Fshockwave-curriculum\u002Flessons\u002Fch13-common-gotchas\u002F13-common-gotchas","Common Gotchas","shockwave-curriculum\u002Flessons\u002Fch13-common-gotchas\u002F13-common-gotchas",{"path":197,"title":198,"stem":199},"\u002Fshockwave-curriculum\u002Flessons\u002Fch14-why-design-patterns\u002F14-why-design-patterns","Why Design Patterns?","shockwave-curriculum\u002Flessons\u002Fch14-why-design-patterns\u002F14-why-design-patterns",{"path":201,"title":202,"stem":203},"\u002Fshockwave-curriculum\u002Flessons\u002Fch15-advanced-collections\u002F15-advanced-collections","Advanced Collections (Set\u002FQueue\u002FMap)","shockwave-curriculum\u002Flessons\u002Fch15-advanced-collections\u002F15-advanced-collections",{"path":205,"title":206,"stem":207},"\u002Fshockwave-curriculum\u002Flessons\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics","Writing Your Own Generics","shockwave-curriculum\u002Flessons\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics",{"path":209,"title":210,"stem":211},"\u002Fshockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F1-inheritance-superclass-subclass","Inheritance, Superclass, Subclass","shockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F17.1-inheritance-superclass-subclass",{"path":213,"title":214,"stem":215},"\u002Fshockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F2-inheritance-and-constructors","Inheritance and Constructors","shockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F17.2-inheritance-and-constructors",{"path":217,"title":218,"stem":219},"\u002Fshockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F3-inheritance-hierarchies","Inheritance Hierarchies","shockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F17.3-inheritance-hierarchies",{"path":221,"title":222,"stem":223},"\u002Fshockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F4-object-superclass","Object Superclass","shockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F17.4-object-superclass",{"path":225,"title":226,"stem":227},"\u002Fshockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F5-abstract-classes-and-methods","Abstract Classes and Methods","shockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F17.5-abstract-classes-and-methods",{"path":229,"title":230,"stem":231},"\u002Fshockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F1-overriding-methods","Overriding Methods","shockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F18.1-overriding-methods",{"path":233,"title":234,"stem":235},"\u002Fshockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F2-super-keyword","super Keyword","shockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F18.2-super-keyword",{"path":237,"title":238,"stem":239},"\u002Fshockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F3-polymorphism","Polymorphism","shockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F18.3-polymorphism",{"path":241,"title":242,"stem":243},"\u002Fshockwave-curriculum\u002Flessons\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts","Interfaces as Contracts","shockwave-curriculum\u002Flessons\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts",{"path":245,"title":246,"stem":247},"\u002Fshockwave-curriculum\u002Flessons\u002Fch19-interfaces-as-contracts\u002F1-lambdas-and-method-references","Lambdas & Method References","shockwave-curriculum\u002Flessons\u002Fch19-interfaces-as-contracts\u002F19.1-lambdas-and-method-references",{"path":249,"title":250,"stem":251},"\u002Fshockwave-curriculum\u002Flessons\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern","The IO-Layer Pattern","shockwave-curriculum\u002Flessons\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern",{"path":253,"title":254,"stem":255},"\u002Fshockwave-curriculum\u002Flessons\u002Fch21-static-factories\u002F21-static-factories","Static Factories","shockwave-curriculum\u002Flessons\u002Fch21-static-factories\u002F21-static-factories",{"path":257,"title":258,"stem":259},"\u002Fshockwave-curriculum\u002Flessons\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern","The Builder Pattern","shockwave-curriculum\u002Flessons\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern",{"path":261,"title":262,"stem":263},"\u002Fshockwave-curriculum\u002Flessons\u002Fch23-encapsulation-and-final\u002F1-scope-and-access","Access, final, and Immutability","shockwave-curriculum\u002Flessons\u002Fch23-encapsulation-and-final\u002F23.1-scope-and-access",{"path":265,"title":266,"stem":267},"\u002Fshockwave-curriculum\u002Flessons\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions","Optional: Avoiding Null Pointer Exceptions","shockwave-curriculum\u002Flessons\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions",{"path":269,"title":270,"stem":271},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F1-what-is-command-based-programming","What Is Command-Based Programming?","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.1-what-is-command-based-programming",{"path":273,"title":274,"stem":275},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F2-commands-and-command-compositions","Commands & Command Compositions","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.2-commands-and-command-compositions",{"path":277,"title":278,"stem":279},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F3-the-command-scheduler","The Command Scheduler","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.3-the-command-scheduler",{"path":281,"title":282,"stem":283},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F4-state-machines-logic","State Machines: Logic","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.4-state-machines-logic",{"path":285,"title":286,"stem":287},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F5-managing-transitions","Managing Transitions","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.5-managing-transitions",{"path":289,"title":290,"stem":291},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F6-binding-commands-to-triggers","Binding Commands to Triggers","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.6-binding-commands-to-triggers",{"path":293,"title":294,"stem":295},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F7-structuring-a-command-based-robot-project","Structuring a Command-Based Robot Project","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.7-structuring-a-command-based-robot-project",{"path":297,"title":298,"stem":299},"\u002Fshockwave-curriculum\u002Flessons\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways","Architecture Takeaways","shockwave-curriculum\u002Flessons\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways",{"path":301,"title":302,"stem":303},"\u002Fshockwave-curriculum\u002Flessons\u002Fch27-program-design-and-abstraction\u002F1-abstraction-and-program-design","Abstraction and Program Design","shockwave-curriculum\u002Flessons\u002Fch27-program-design-and-abstraction\u002F27.1-abstraction-and-program-design",{"path":305,"title":306,"stem":307},"\u002Fshockwave-curriculum\u002Flessons\u002Fch27-program-design-and-abstraction\u002F2-impact-of-program-design","Impact of Program Design","shockwave-curriculum\u002Flessons\u002Fch27-program-design-and-abstraction\u002F27.2-impact-of-program-design",{"path":309,"title":310,"stem":311},"\u002Fshockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F1-searching-algorithms","Searching Algorithms","shockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.1-searching-algorithms",{"path":313,"title":314,"stem":315},"\u002Fshockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F2-sorting-algorithms","Sorting Algorithms","shockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.2-sorting-algorithms",{"path":317,"title":318,"stem":319},"\u002Fshockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F3-recursion","Recursion","shockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.3-recursion",{"path":321,"title":322,"stem":323},"\u002Fshockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F4-recursive-searching-and-sorting","Recursive Searching and Sorting","shockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.4-recursive-searching-and-sorting",{"path":325,"title":326,"stem":327},"\u002Fshockwave-curriculum\u002Flessons\u002Fch29-git-and-github-basics\u002F1-coming-soon","Git & GitHub Basics — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch29-git-and-github-basics\u002F29.1-coming-soon",{"path":329,"title":330,"stem":331},"\u002Fshockwave-curriculum\u002Flessons\u002Fch30-git-history-and-merging\u002F1-coming-soon","Git — History & Merging — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch30-git-history-and-merging\u002F30.1-coming-soon",{"path":333,"title":334,"stem":335},"\u002Fshockwave-curriculum\u002Flessons\u002Fch31-dev-environment-and-tooling\u002F1-coming-soon","Dev Environment & Tooling — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch31-dev-environment-and-tooling\u002F31.1-coming-soon",{"path":337,"title":338,"stem":339},"\u002Fshockwave-curriculum\u002Flessons\u002Fch32-unit-testing\u002F1-coming-soon","Unit Testing — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch32-unit-testing\u002F32.1-coming-soon",{"path":341,"title":342,"stem":343},"\u002Fshockwave-curriculum\u002Flessons\u002Fch33-advantagekit-autologging\u002F1-coming-soon","AdvantageKit — AutoLogging — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch33-advantagekit-autologging\u002F33.1-coming-soon",{"path":345,"title":346,"stem":347},"\u002Fshockwave-curriculum\u002Flessons\u002Fch34-log-replay\u002F1-coming-soon","Log Replay — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch34-log-replay\u002F34.1-coming-soon",{"path":349,"title":350,"stem":351},"\u002Fshockwave-curriculum\u002Flessons\u002Fch35-advantagescope-i-visualization\u002F1-coming-soon","AdvantageScope I: Visualization — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch35-advantagescope-i-visualization\u002F35.1-coming-soon",{"path":353,"title":354,"stem":355},"\u002Fshockwave-curriculum\u002Flessons\u002Fch36-advantagescope-ii-custom-3d-assets\u002F1-coming-soon","AdvantageScope II: Custom 3D Assets — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch36-advantagescope-ii-custom-3d-assets\u002F36.1-coming-soon",{"path":357,"title":358,"stem":359},"\u002Fshockwave-curriculum\u002Flessons\u002Fch37-autonomous-i\u002F1-coming-soon","Autonomous I — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch37-autonomous-i\u002F37.1-coming-soon",{"path":361,"title":362,"stem":363},"\u002Fshockwave-curriculum\u002Flessons\u002Fch38-autonomous-ii-pathplanner-and-trajectories\u002F1-coming-soon","Autonomous II: PathPlanner & Trajectories — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch38-autonomous-ii-pathplanner-and-trajectories\u002F38.1-coming-soon",{"path":365,"title":366,"stem":367},"\u002Fshockwave-curriculum\u002Flessons\u002Fch39-control-fundamentals\u002F1-coming-soon","Control Fundamentals — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch39-control-fundamentals\u002F39.1-coming-soon",{"path":369,"title":370,"stem":371},"\u002Fshockwave-curriculum\u002Flessons\u002Fch40-motion-profiles\u002F1-coming-soon","Motion Profiles — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch40-motion-profiles\u002F40.1-coming-soon",{"path":373,"title":374,"stem":375},"\u002Fshockwave-curriculum\u002Flessons\u002Fch41-hardware-fundamentals\u002F1-coming-soon","Hardware Fundamentals — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch41-hardware-fundamentals\u002F41.1-coming-soon",{"path":377,"title":378,"stem":379},"\u002Fshockwave-curriculum\u002Flessons\u002Fch42-photonvision\u002F1-coming-soon","PhotonVision — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch42-photonvision\u002F42.1-coming-soon",{"path":381,"title":382,"stem":383},"\u002Fshockwave-curriculum\u002Flessons\u002Fch43-apriltags-and-pose\u002F1-coming-soon","AprilTags & Pose — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch43-apriltags-and-pose\u002F43.1-coming-soon",{"path":385,"title":386,"stem":387},"\u002Fshockwave-curriculum\u002Flessons\u002Fch44-subsystems-i\u002F1-coming-soon","Subsystems I — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch44-subsystems-i\u002F44.1-coming-soon",{"path":389,"title":390,"stem":391},"\u002Fshockwave-curriculum\u002Flessons\u002Fch45-subsystems-ii-advanced\u002F1-coming-soon","Subsystems II — Advanced — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch45-subsystems-ii-advanced\u002F45.1-coming-soon",{"path":393,"title":394,"stem":395},"\u002Fshockwave-curriculum\u002Flessons\u002Fch46-team-utilities-i\u002F1-coming-soon","Team Utilities I — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch46-team-utilities-i\u002F46.1-coming-soon",{"path":397,"title":398,"stem":399},"\u002Fshockwave-curriculum\u002Flessons\u002Fch47-field-constants\u002F1-coming-soon","Field Constants — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch47-field-constants\u002F47.1-coming-soon",{"path":401,"title":402,"stem":403},"\u002Fshockwave-curriculum\u002Flessons\u002Fch48-troubleshooting-i-runtime-debug\u002F1-coming-soon","Troubleshooting I — Runtime Debug — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch48-troubleshooting-i-runtime-debug\u002F48.1-coming-soon",{"path":405,"title":406,"stem":407},"\u002Fshockwave-curriculum\u002Flessons\u002Fch49-troubleshooting-ii-can-and-sim\u002F1-coming-soon","Troubleshooting II: CAN & Sim — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch49-troubleshooting-ii-can-and-sim\u002F49.1-coming-soon",{"path":409,"title":410,"stem":411},"\u002Fshockwave-curriculum\u002Flessons\u002Fch50-vendor-libraries-talonfx\u002F1-coming-soon","Vendor Libraries: TalonFX — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch50-vendor-libraries-talonfx\u002F50.1-coming-soon",{"path":413,"title":414,"stem":415},"\u002Fshockwave-curriculum\u002Flessons\u002Fch51-robot-alerts\u002F1-coming-soon","Robot Alerts — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch51-robot-alerts\u002F51.1-coming-soon",{"path":417,"title":418,"stem":419},"\u002Fshockwave-curriculum\u002Flessons\u002Fch52-wpilib-commands\u002F1-coming-soon","WPILib Commands — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch52-wpilib-commands\u002F52.1-coming-soon",{"path":421,"title":422,"stem":423},"\u002Fshockwave-curriculum\u002Flessons\u002Fch53-wpilib-geometry\u002F1-coming-soon","WPILib Geometry — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch53-wpilib-geometry\u002F53.1-coming-soon",{"path":425,"title":426,"stem":427},"\u002Fshockwave-curriculum\u002Flessons\u002Fch54-networktables\u002F1-coming-soon","NetworkTables — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch54-networktables\u002F54.1-coming-soon",{"path":429,"title":430,"stem":431},"\u002Fshockwave-curriculum\u002Flessons\u002Fch55-command-scheduler\u002F1-coming-soon","Command Scheduler — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch55-command-scheduler\u002F55.1-coming-soon",{"path":433,"title":434,"stem":435},"\u002Fshockwave-curriculum\u002Flessons\u002Fch56-wpilib-timers\u002F1-coming-soon","WPILib Timers — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch56-wpilib-timers\u002F56.1-coming-soon",{"path":437,"title":438,"stem":439},"\u002Fshockwave-curriculum\u002Flessons\u002Fch57-wpilib-triggers\u002F1-coming-soon","WPILib Triggers — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch57-wpilib-triggers\u002F57.1-coming-soon",{"path":441,"title":442,"stem":443},"\u002Fshockwave-curriculum\u002Flessons\u002Fch58-vendor-units-and-conversions\u002F1-coming-soon","Vendor Units & Conversions — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch58-vendor-units-and-conversions\u002F58.1-coming-soon",[445,449,453,457,461,465,469,473,477,481,485,489,493,497,501,505,509,513,517,521,525,529,533,537,541,545,549,553,557,561,565,569,573,577,581,585,589,593,597,601,605,609,613,617,621,625,629,633,637,641,645,649,653,657,661,665,669,673,677,681,685,689,693,697,701,705,709,713,717,721,725,729,733,737,741,745,749],{"path":446,"title":447,"stem":448},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch01-why-java-for-frc\u002F2-intro-to-algorithms-programming-and-compilers","Intro to Algorithms, Programming and Compilers — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch01-why-java-for-frc\u002F1.2-intro-to-algorithms-programming-and-compilers",{"path":450,"title":451,"stem":452},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F1-variables-and-data-types","Variables & Data Types — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2.1-variables-and-data-types",{"path":454,"title":455,"stem":456},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2-expressions-and-output","Expressions & Output — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2.2-expressions-and-output",{"path":458,"title":459,"stem":460},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F3-assignment-and-input","Assignment & Input — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2.3-assignment-and-input",{"path":462,"title":463,"stem":464},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F4-casting-and-ranges-of-values","Casting & Ranges of Values — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2.4-casting-and-ranges-of-values",{"path":466,"title":467,"stem":468},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F5-compound-assignment-operators","Compound Assignment Operators — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2.5-compound-assignment-operators",{"path":470,"title":471,"stem":472},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F1-apis-and-libraries","APIs and Libraries — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F3.1-apis-and-libraries",{"path":474,"title":475,"stem":476},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F2-documentation-with-comments-and-preconditions","Documentation with Comments and Preconditions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F3.2-documentation-with-comments-and-preconditions",{"path":478,"title":479,"stem":480},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F3-packages-and-imports","Packages & Imports — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F3.3-packages-and-imports",{"path":482,"title":483,"stem":484},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F1-methods-signatures-and-parameters","Methods, Signatures & Parameters — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.1-methods-signatures-and-parameters",{"path":486,"title":487,"stem":488},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F2-calling-class-methods","Calling Class Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.2-calling-class-methods",{"path":490,"title":491,"stem":492},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F3-using-the-math-class","Using the Math Class — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.3-using-the-math-class",{"path":494,"title":495,"stem":496},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4-objects-instances-of-classes","Objects — Instances of Classes — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.4-objects-instances-of-classes",{"path":498,"title":499,"stem":500},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F5-creating-and-initializing-objects-constructors","Creating & Initializing Objects: Constructors — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.5-creating-and-initializing-objects-constructors",{"path":502,"title":503,"stem":504},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F6-calling-instance-methods","Calling Instance Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.6-calling-instance-methods",{"path":506,"title":507,"stem":508},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F1-5.2-if-statements-and-for-loops","if Statements & For Loops — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.1-5.2-if-statements-and-for-loops",{"path":510,"title":511,"stem":512},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F10-nested-iteration","Nested Iteration — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.10-nested-iteration",{"path":514,"title":515,"stem":516},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F11-informal-runtime-analysis-of-loops","Informal Runtime Analysis of Loops — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.11-informal-runtime-analysis-of-loops",{"path":518,"title":519,"stem":520},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F12-switch-statements-and-expressions","switch Statements and Expressions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.12-switch-statements-and-expressions",{"path":522,"title":523,"stem":524},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F3-algorithms-with-selection-and-repetition","Algorithms with Selection and Repetition — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.3-algorithms-with-selection-and-repetition",{"path":526,"title":527,"stem":528},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F4-boolean-expressions","Boolean Expressions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.4-boolean-expressions",{"path":530,"title":531,"stem":532},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5-nested-if-statements","Nested if Statements — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.5-nested-if-statements",{"path":534,"title":535,"stem":536},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F6-compound-boolean-expressions","Compound Boolean Expressions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.6-compound-boolean-expressions",{"path":538,"title":539,"stem":540},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F7-comparing-boolean-expressions-de-morgans-laws","Comparing Boolean Expressions (De Morgan's Laws) — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.7-comparing-boolean-expressions-de-morgans-laws",{"path":542,"title":543,"stem":544},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F8-while-loops","While Loops — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.8-while-loops",{"path":546,"title":547,"stem":548},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F9-implementing-selection-and-iteration-algorithms","Implementing Selection and Iteration Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.9-implementing-selection-and-iteration-algorithms",{"path":550,"title":551,"stem":552},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch06-strings\u002F1-strings","Strings — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch06-strings\u002F6.1-strings",{"path":554,"title":555,"stem":556},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch06-strings\u002F2-string-algorithms","String Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch06-strings\u002F6.2-string-algorithms",{"path":558,"title":559,"stem":560},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F1-anatomy-of-a-java-class","Anatomy of a Java Class — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F7.1-anatomy-of-a-java-class",{"path":562,"title":563,"stem":564},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F2-methods-how-to-write-them","Methods: How to Write Them — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F7.2-methods-how-to-write-them",{"path":566,"title":567,"stem":568},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F3-methods-passing-and-returning-references-of-an-object","Methods: Passing & Returning References of an Object — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F7.3-methods-passing-and-returning-references-of-an-object",{"path":570,"title":571,"stem":572},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F4-class-static-variables-and-methods","Class (static) Variables & Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F7.4-class-static-variables-and-methods",{"path":574,"title":575,"stem":576},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch08-constructors-and-this\u002F1-8.2-constructors-and-this","Constructors & \"this\" — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch08-constructors-and-this\u002F8.1-8.2-constructors-and-this",{"path":578,"title":579,"stem":580},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F1-array-creation-and-access","Array Creation and Access — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.1-array-creation-and-access",{"path":582,"title":583,"stem":584},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F2-arraylist-and-its-methods","ArrayList and its Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.2-arraylist-and-its-methods",{"path":586,"title":587,"stem":588},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F3-optional-hashmap-dictionary-data-structure","HashMap (Dictionary) Data Structure — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.3-optional-hashmap-dictionary-data-structure",{"path":590,"title":591,"stem":592},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F4-array-traversals","Array Traversals — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.4-array-traversals",{"path":594,"title":595,"stem":596},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F5-implementing-array-algorithms","Implementing Array Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.5-implementing-array-algorithms",{"path":598,"title":599,"stem":600},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F6-arraylist-traversals","ArrayList Traversals — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.6-arraylist-traversals",{"path":602,"title":603,"stem":604},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F7-implementing-arraylist-algorithms","Implementing ArrayList Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.7-implementing-arraylist-algorithms",{"path":606,"title":607,"stem":608},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F8-using-text-files","Using Text Files — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.8-using-text-files",{"path":610,"title":611,"stem":612},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F1-2d-array-creation-and-access","2D Array Creation and Access — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F10.1-2d-array-creation-and-access",{"path":614,"title":615,"stem":616},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F2-2d-array-traversals-nested-loops","2D Array Traversals: Nested Loops — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F10.2-2d-array-traversals-nested-loops",{"path":618,"title":619,"stem":620},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F3-implementing-2d-array-algorithms","Implementing 2D Array Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F10.3-implementing-2d-array-algorithms",{"path":622,"title":623,"stem":624},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch11-enums-named-choices\u002F11-enums-named-choices","Enums: Named Choices — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch11-enums-named-choices\u002F11-enums-named-choices",{"path":626,"title":627,"stem":628},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch","Exceptions & try\u002Fcatch — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch",{"path":630,"title":631,"stem":632},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch13-common-gotchas\u002F13-common-gotchas","Common Gotchas — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch13-common-gotchas\u002F13-common-gotchas",{"path":634,"title":635,"stem":636},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch15-advanced-collections\u002F15-advanced-collections","Advanced Collections (Set\u002FQueue\u002FMap) — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch15-advanced-collections\u002F15-advanced-collections",{"path":638,"title":639,"stem":640},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics","Writing Your Own Generics — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics",{"path":642,"title":643,"stem":644},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F1-inheritance-superclass-subclass","Inheritance, Superclass, Subclass — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F17.1-inheritance-superclass-subclass",{"path":646,"title":647,"stem":648},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F2-inheritance-and-constructors","Inheritance and Constructors — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F17.2-inheritance-and-constructors",{"path":650,"title":651,"stem":652},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F3-inheritance-hierarchies","Inheritance Hierarchies — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F17.3-inheritance-hierarchies",{"path":654,"title":655,"stem":656},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F4-object-superclass","Object Superclass — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F17.4-object-superclass",{"path":658,"title":659,"stem":660},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F5-abstract-classes-and-methods","Abstract Classes and Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F17.5-abstract-classes-and-methods",{"path":662,"title":663,"stem":664},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F1-overriding-methods","Overriding Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F18.1-overriding-methods",{"path":666,"title":667,"stem":668},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F2-super-keyword","super Keyword — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F18.2-super-keyword",{"path":670,"title":671,"stem":672},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F3-polymorphism","Polymorphism — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F18.3-polymorphism",{"path":674,"title":675,"stem":676},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts","Interfaces as Contracts — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts",{"path":678,"title":679,"stem":680},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch19-interfaces-as-contracts\u002F1-lambdas-and-method-references","Lambdas & Method References — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch19-interfaces-as-contracts\u002F19.1-lambdas-and-method-references",{"path":682,"title":683,"stem":684},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern","The IO-Layer Pattern — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern",{"path":686,"title":687,"stem":688},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch21-static-factories\u002F21-static-factories","Static Factories — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch21-static-factories\u002F21-static-factories",{"path":690,"title":691,"stem":692},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern","The Builder Pattern — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern",{"path":694,"title":695,"stem":696},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch23-encapsulation-and-final\u002F1-scope-and-access","Access, final, and Immutability — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch23-encapsulation-and-final\u002F23.1-scope-and-access",{"path":698,"title":699,"stem":700},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions","Optional: Avoiding Null Pointer Exceptions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions",{"path":702,"title":703,"stem":704},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F1-what-is-command-based-programming","What Is Command-Based Programming? — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.1-what-is-command-based-programming",{"path":706,"title":707,"stem":708},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F2-commands-and-command-compositions","Commands & Command Compositions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.2-commands-and-command-compositions",{"path":710,"title":711,"stem":712},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F3-the-command-scheduler","The Command Scheduler — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.3-the-command-scheduler",{"path":714,"title":715,"stem":716},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F4-state-machines-logic","State Machines: Logic — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.4-state-machines-logic",{"path":718,"title":719,"stem":720},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F5-managing-transitions","Managing Transitions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.5-managing-transitions",{"path":722,"title":723,"stem":724},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F6-binding-commands-to-triggers","Binding Commands to Triggers — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.6-binding-commands-to-triggers",{"path":726,"title":727,"stem":728},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F7-structuring-a-command-based-robot-project","Structuring a Command-Based Robot Project — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.7-structuring-a-command-based-robot-project",{"path":730,"title":731,"stem":732},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways","Architecture Takeaways — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways",{"path":734,"title":735,"stem":736},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch27-program-design-and-abstraction\u002F1-abstraction-and-program-design","Abstraction and Program Design — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch27-program-design-and-abstraction\u002F27.1-abstraction-and-program-design",{"path":738,"title":739,"stem":740},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F1-searching-algorithms","Searching Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F28.1-searching-algorithms",{"path":742,"title":743,"stem":744},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F2-sorting-algorithms","Sorting Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F28.2-sorting-algorithms",{"path":746,"title":747,"stem":748},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F3-recursion","Recursion — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F28.3-recursion",{"path":750,"title":751,"stem":752},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F4-recursive-searching-and-sorting","Recursive Searching and Sorting — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F28.4-recursive-searching-and-sorting",[754,758,762,766,770,774,778,782,786,790,794,798,802,806,810,814,818,822,826,830,834,838,842,846,850,854,858,862,866,870,874,878,882,886,890,894,898,902,906,910,914,918,922,926,930,934,938,942,946,950,954,958,962,966,970,974,978,982,986,990,994,998,1002,1006,1010,1014,1018,1022,1026,1030,1034,1038,1042,1046,1050,1054,1058,1062,1066],{"path":755,"title":756,"stem":757},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch01-why-java-for-frc\u002F2-intro-to-algorithms-programming-and-compilers","Intro to Algorithms, Programming and Compilers — Exercises","shockwave-curriculum\u002Fexercises\u002Fch01-why-java-for-frc\u002F1.2-intro-to-algorithms-programming-and-compilers",{"path":759,"title":760,"stem":761},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F1-variables-and-data-types","Variables & Data Types — Exercises","shockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2.1-variables-and-data-types",{"path":763,"title":764,"stem":765},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2-expressions-and-output","Expressions & Output — Exercises","shockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2.2-expressions-and-output",{"path":767,"title":768,"stem":769},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F3-assignment-and-input","Assignment & Input — Exercises","shockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2.3-assignment-and-input",{"path":771,"title":772,"stem":773},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F4-casting-and-ranges-of-values","Casting & Ranges of Values — Exercises","shockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2.4-casting-and-ranges-of-values",{"path":775,"title":776,"stem":777},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F5-compound-assignment-operators","Compound Assignment Operators — Exercises","shockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2.5-compound-assignment-operators",{"path":779,"title":780,"stem":781},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F1-apis-and-libraries","APIs and Libraries — Exercises","shockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F3.1-apis-and-libraries",{"path":783,"title":784,"stem":785},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F2-documentation-with-comments-and-preconditions","Documentation with Comments and Preconditions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F3.2-documentation-with-comments-and-preconditions",{"path":787,"title":788,"stem":789},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F3-packages-and-imports","Packages & Imports — Exercises","shockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F3.3-packages-and-imports",{"path":791,"title":792,"stem":793},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F1-methods-signatures-and-parameters","Methods, Signatures & Parameters — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.1-methods-signatures-and-parameters",{"path":795,"title":796,"stem":797},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F2-calling-class-methods","Calling Class Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.2-calling-class-methods",{"path":799,"title":800,"stem":801},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F3-using-the-math-class","Using the Math Class — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.3-using-the-math-class",{"path":803,"title":804,"stem":805},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4-objects-instances-of-classes","Objects — Instances of Classes — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.4-objects-instances-of-classes",{"path":807,"title":808,"stem":809},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F5-creating-and-initializing-objects-constructors","Creating & Initializing Objects: Constructors — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.5-creating-and-initializing-objects-constructors",{"path":811,"title":812,"stem":813},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F6-calling-instance-methods","Calling Instance Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.6-calling-instance-methods",{"path":815,"title":816,"stem":817},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F1-5.2-if-statements-and-for-loops","if Statements & For Loops — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.1-5.2-if-statements-and-for-loops",{"path":819,"title":820,"stem":821},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F10-nested-iteration","Nested Iteration — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.10-nested-iteration",{"path":823,"title":824,"stem":825},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F11-informal-runtime-analysis-of-loops","Informal Runtime Analysis of Loops — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.11-informal-runtime-analysis-of-loops",{"path":827,"title":828,"stem":829},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F12-switch-statements-and-expressions","switch Statements and Expressions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.12-switch-statements-and-expressions",{"path":831,"title":832,"stem":833},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F3-algorithms-with-selection-and-repetition","Algorithms with Selection and Repetition — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.3-algorithms-with-selection-and-repetition",{"path":835,"title":836,"stem":837},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F4-boolean-expressions","Boolean Expressions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.4-boolean-expressions",{"path":839,"title":840,"stem":841},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5-nested-if-statements","Nested if Statements — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.5-nested-if-statements",{"path":843,"title":844,"stem":845},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F6-compound-boolean-expressions","Compound Boolean Expressions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.6-compound-boolean-expressions",{"path":847,"title":848,"stem":849},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F7-comparing-boolean-expressions-de-morgans-laws","Comparing Boolean Expressions (De Morgan's Laws) — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.7-comparing-boolean-expressions-de-morgans-laws",{"path":851,"title":852,"stem":853},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F8-while-loops","While Loops — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.8-while-loops",{"path":855,"title":856,"stem":857},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F9-implementing-selection-and-iteration-algorithms","Implementing Selection and Iteration Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.9-implementing-selection-and-iteration-algorithms",{"path":859,"title":860,"stem":861},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch06-strings\u002F1-strings","Strings — Exercises","shockwave-curriculum\u002Fexercises\u002Fch06-strings\u002F6.1-strings",{"path":863,"title":864,"stem":865},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch06-strings\u002F2-string-algorithms","String Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch06-strings\u002F6.2-string-algorithms",{"path":867,"title":868,"stem":869},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F1-anatomy-of-a-java-class","Anatomy of a Java Class — Exercises","shockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F7.1-anatomy-of-a-java-class",{"path":871,"title":872,"stem":873},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F2-methods-how-to-write-them","Methods: How to Write Them — Exercises","shockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F7.2-methods-how-to-write-them",{"path":875,"title":876,"stem":877},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F3-methods-passing-and-returning-references-of-an-object","Methods: Passing & Returning References of an Object — Exercises","shockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F7.3-methods-passing-and-returning-references-of-an-object",{"path":879,"title":880,"stem":881},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F4-class-static-variables-and-methods","Class (static) Variables & Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F7.4-class-static-variables-and-methods",{"path":883,"title":884,"stem":885},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch08-constructors-and-this\u002F1-8.2-constructors-and-this","Constructors & \"this\" — Exercises","shockwave-curriculum\u002Fexercises\u002Fch08-constructors-and-this\u002F8.1-8.2-constructors-and-this",{"path":887,"title":888,"stem":889},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F1-array-creation-and-access","Array Creation and Access — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.1-array-creation-and-access",{"path":891,"title":892,"stem":893},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F2-arraylist-and-its-methods","ArrayList and its Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.2-arraylist-and-its-methods",{"path":895,"title":896,"stem":897},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F3-optional-hashmap-dictionary-data-structure","HashMap (Dictionary) Data Structure — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.3-optional-hashmap-dictionary-data-structure",{"path":899,"title":900,"stem":901},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F4-array-traversals","Array Traversals — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.4-array-traversals",{"path":903,"title":904,"stem":905},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F5-implementing-array-algorithms","Implementing Array Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.5-implementing-array-algorithms",{"path":907,"title":908,"stem":909},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F6-arraylist-traversals","ArrayList Traversals — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.6-arraylist-traversals",{"path":911,"title":912,"stem":913},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F7-implementing-arraylist-algorithms","Implementing ArrayList Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.7-implementing-arraylist-algorithms",{"path":915,"title":916,"stem":917},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F8-using-text-files","Using Text Files — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.8-using-text-files",{"path":919,"title":920,"stem":921},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F1-2d-array-creation-and-access","2D Array Creation and Access — Exercises","shockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F10.1-2d-array-creation-and-access",{"path":923,"title":924,"stem":925},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F2-2d-array-traversals-nested-loops","2D Array Traversals: Nested Loops — Exercises","shockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F10.2-2d-array-traversals-nested-loops",{"path":927,"title":928,"stem":929},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F3-implementing-2d-array-algorithms","Implementing 2D Array Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F10.3-implementing-2d-array-algorithms",{"path":931,"title":932,"stem":933},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch11-enums-named-choices\u002F11-enums-named-choices","Enums: Named Choices — Exercises","shockwave-curriculum\u002Fexercises\u002Fch11-enums-named-choices\u002F11-enums-named-choices",{"path":935,"title":936,"stem":937},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch","Exceptions & try\u002Fcatch — Exercises","shockwave-curriculum\u002Fexercises\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch",{"path":939,"title":940,"stem":941},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch13-common-gotchas\u002F13-common-gotchas","Common Gotchas — Exercises","shockwave-curriculum\u002Fexercises\u002Fch13-common-gotchas\u002F13-common-gotchas",{"path":943,"title":944,"stem":945},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch14-why-design-patterns\u002F14-why-design-patterns","Why Design Patterns? — Exercises","shockwave-curriculum\u002Fexercises\u002Fch14-why-design-patterns\u002F14-why-design-patterns",{"path":947,"title":948,"stem":949},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch15-advanced-collections\u002F15-advanced-collections","Advanced Collections (Set\u002FQueue\u002FMap) — Exercises","shockwave-curriculum\u002Fexercises\u002Fch15-advanced-collections\u002F15-advanced-collections",{"path":951,"title":952,"stem":953},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics","Writing Your Own Generics — Exercises","shockwave-curriculum\u002Fexercises\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics",{"path":955,"title":956,"stem":957},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F1-inheritance-superclass-subclass","Inheritance, Superclass, Subclass — Exercises","shockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F17.1-inheritance-superclass-subclass",{"path":959,"title":960,"stem":961},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F2-inheritance-and-constructors","Inheritance and Constructors — Exercises","shockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F17.2-inheritance-and-constructors",{"path":963,"title":964,"stem":965},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F3-inheritance-hierarchies","Inheritance Hierarchies — Exercises","shockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F17.3-inheritance-hierarchies",{"path":967,"title":968,"stem":969},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F4-object-superclass","Object Superclass — Exercises","shockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F17.4-object-superclass",{"path":971,"title":972,"stem":973},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F5-abstract-classes-and-methods","Abstract Classes and Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F17.5-abstract-classes-and-methods",{"path":975,"title":976,"stem":977},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F1-overriding-methods","Overriding Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F18.1-overriding-methods",{"path":979,"title":980,"stem":981},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F2-super-keyword","super Keyword — Exercises","shockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F18.2-super-keyword",{"path":983,"title":984,"stem":985},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F3-polymorphism","Polymorphism — Exercises","shockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F18.3-polymorphism",{"path":987,"title":988,"stem":989},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts","Interfaces as Contracts — Exercises","shockwave-curriculum\u002Fexercises\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts",{"path":991,"title":992,"stem":993},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch19-interfaces-as-contracts\u002F1-lambdas-and-method-references","Lambdas & Method References — Exercises","shockwave-curriculum\u002Fexercises\u002Fch19-interfaces-as-contracts\u002F19.1-lambdas-and-method-references",{"path":995,"title":996,"stem":997},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern","The IO-Layer Pattern — Exercises","shockwave-curriculum\u002Fexercises\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern",{"path":999,"title":1000,"stem":1001},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch21-static-factories\u002F21-static-factories","Static Factories — Exercises","shockwave-curriculum\u002Fexercises\u002Fch21-static-factories\u002F21-static-factories",{"path":1003,"title":1004,"stem":1005},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern","The Builder Pattern — Exercises","shockwave-curriculum\u002Fexercises\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern",{"path":1007,"title":1008,"stem":1009},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch23-encapsulation-and-final\u002F1-scope-and-access","Access, final, and Immutability — Exercises","shockwave-curriculum\u002Fexercises\u002Fch23-encapsulation-and-final\u002F23.1-scope-and-access",{"path":1011,"title":1012,"stem":1013},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions","Optional: Avoiding Null Pointer Exceptions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions",{"path":1015,"title":1016,"stem":1017},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F1-what-is-command-based-programming","What Is Command-Based Programming? — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.1-what-is-command-based-programming",{"path":1019,"title":1020,"stem":1021},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F2-commands-and-command-compositions","Commands & Command Compositions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.2-commands-and-command-compositions",{"path":1023,"title":1024,"stem":1025},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F3-the-command-scheduler","The Command Scheduler — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.3-the-command-scheduler",{"path":1027,"title":1028,"stem":1029},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F4-state-machines-logic","State Machines: Logic — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.4-state-machines-logic",{"path":1031,"title":1032,"stem":1033},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F5-managing-transitions","Managing Transitions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.5-managing-transitions",{"path":1035,"title":1036,"stem":1037},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F6-binding-commands-to-triggers","Binding Commands to Triggers — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.6-binding-commands-to-triggers",{"path":1039,"title":1040,"stem":1041},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F7-structuring-a-command-based-robot-project","Structuring a Command-Based Robot Project — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.7-structuring-a-command-based-robot-project",{"path":1043,"title":1044,"stem":1045},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways","Architecture Takeaways — Exercises","shockwave-curriculum\u002Fexercises\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways",{"path":1047,"title":1048,"stem":1049},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch27-program-design-and-abstraction\u002F1-abstraction-and-program-design","Abstraction and Program Design — Exercises","shockwave-curriculum\u002Fexercises\u002Fch27-program-design-and-abstraction\u002F27.1-abstraction-and-program-design",{"path":1051,"title":1052,"stem":1053},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch27-program-design-and-abstraction\u002F2-impact-of-program-design","Impact of Program Design — Exercises","shockwave-curriculum\u002Fexercises\u002Fch27-program-design-and-abstraction\u002F27.2-impact-of-program-design",{"path":1055,"title":1056,"stem":1057},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F1-searching-algorithms","Searching Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F28.1-searching-algorithms",{"path":1059,"title":1060,"stem":1061},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F2-sorting-algorithms","Sorting Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F28.2-sorting-algorithms",{"path":1063,"title":1064,"stem":1065},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F3-recursion","Recursion — Exercises","shockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F28.3-recursion",{"path":1067,"title":1068,"stem":1069},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F4-recursive-searching-and-sorting","Recursive Searching and Sorting — Exercises","shockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F28.4-recursive-searching-and-sorting",{"id":1071,"title":322,"body":1072,"description":1696,"extension":1697,"meta":1698,"navigation":1343,"path":321,"seo":1701,"stem":323,"__hash__":1702},"lessons\u002Fshockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.4-recursive-searching-and-sorting.md",{"type":1073,"value":1074,"toc":1689},"minimark",[1075,1079,1087,1092,1108,1245,1264,1268,1290,1306,1383,1393,1543,1569,1576,1584,1590,1594,1600,1622,1626,1650,1654,1674,1685],[1076,1077,322],"h1",{"id":1078},"recursive-searching-and-sorting",[1080,1081,1082,1086],"p",{},[1083,1084,1085],"strong",{},"⚠ Optional chapter."," Combines Lessons 28.1-28.3: the same searching\u002Fsorting ideas, rewritten recursively.",[1088,1089,1091],"h2",{"id":1090},"recursive-binary-search","Recursive Binary Search",[1080,1093,1094,1095,1099,1100,1103,1104,1107],{},"The iterative binary search from Lesson 28.1 tracks ",[1096,1097,1098],"code",{},"left","\u002F",[1096,1101,1102],{},"right"," bounds in loop variables. A recursive version instead passes the shrinking range as parameters, with the range itself doing the job a ",[1096,1105,1106],{},"while"," loop's condition did before:",[1109,1110,1115],"pre",{"className":1111,"code":1112,"language":1113,"meta":1114,"style":1114},"language-java shiki shiki-themes github-light github-dark","public static int recursiveBinarySearch(int[] elements, int start, int end, int target)\n{\n    if (end \u003C start)                          \u002F\u002F base case 1: range is empty — not found\n    {\n        return -1;\n    }\n    int middle = (start + end) \u002F 2;\n    if (target == elements[middle])            \u002F\u002F base case 2: found it\n    {\n        return middle;\n    }\n    else if (target \u003C elements[middle])\n    {\n        \u002F\u002F search the left half\n        return recursiveBinarySearch(elements, start, middle - 1, target);\n    }\n    else\n    {\n        \u002F\u002F search the right half\n        return recursiveBinarySearch(elements, middle + 1, end, target);\n    }\n}\n","java","",[1096,1116,1117,1125,1131,1137,1143,1149,1155,1161,1167,1172,1178,1183,1189,1194,1200,1206,1211,1217,1222,1228,1234,1239],{"__ignoreMap":1114},[1118,1119,1122],"span",{"class":1120,"line":1121},"line",1,[1118,1123,1124],{},"public static int recursiveBinarySearch(int[] elements, int start, int end, int target)\n",[1118,1126,1128],{"class":1120,"line":1127},2,[1118,1129,1130],{},"{\n",[1118,1132,1134],{"class":1120,"line":1133},3,[1118,1135,1136],{},"    if (end \u003C start)                          \u002F\u002F base case 1: range is empty — not found\n",[1118,1138,1140],{"class":1120,"line":1139},4,[1118,1141,1142],{},"    {\n",[1118,1144,1146],{"class":1120,"line":1145},5,[1118,1147,1148],{},"        return -1;\n",[1118,1150,1152],{"class":1120,"line":1151},6,[1118,1153,1154],{},"    }\n",[1118,1156,1158],{"class":1120,"line":1157},7,[1118,1159,1160],{},"    int middle = (start + end) \u002F 2;\n",[1118,1162,1164],{"class":1120,"line":1163},8,[1118,1165,1166],{},"    if (target == elements[middle])            \u002F\u002F base case 2: found it\n",[1118,1168,1170],{"class":1120,"line":1169},9,[1118,1171,1142],{},[1118,1173,1175],{"class":1120,"line":1174},10,[1118,1176,1177],{},"        return middle;\n",[1118,1179,1181],{"class":1120,"line":1180},11,[1118,1182,1154],{},[1118,1184,1186],{"class":1120,"line":1185},12,[1118,1187,1188],{},"    else if (target \u003C elements[middle])\n",[1118,1190,1192],{"class":1120,"line":1191},13,[1118,1193,1142],{},[1118,1195,1197],{"class":1120,"line":1196},14,[1118,1198,1199],{},"        \u002F\u002F search the left half\n",[1118,1201,1203],{"class":1120,"line":1202},15,[1118,1204,1205],{},"        return recursiveBinarySearch(elements, start, middle - 1, target);\n",[1118,1207,1209],{"class":1120,"line":1208},16,[1118,1210,1154],{},[1118,1212,1214],{"class":1120,"line":1213},17,[1118,1215,1216],{},"    else\n",[1118,1218,1220],{"class":1120,"line":1219},18,[1118,1221,1142],{},[1118,1223,1225],{"class":1120,"line":1224},19,[1118,1226,1227],{},"        \u002F\u002F search the right half\n",[1118,1229,1231],{"class":1120,"line":1230},20,[1118,1232,1233],{},"        return recursiveBinarySearch(elements, middle + 1, end, target);\n",[1118,1235,1237],{"class":1120,"line":1236},21,[1118,1238,1154],{},[1118,1240,1242],{"class":1120,"line":1241},22,[1118,1243,1244],{},"}\n",[1080,1246,1247,1248,1251,1252,1255,1256,1259,1260,1263],{},"This has ",[1083,1249,1250],{},"two base cases",": a match at the middle, or an exhausted range. Removing the ",[1096,1253,1254],{},"end \u003C start"," check wouldn't cause a true infinite loop — Java would run out of room first: a not-found search keeps calling itself into an already-empty range until it crashes with ",[1096,1257,1258],{},"StackOverflowError"," (or, if the array is empty to begin with, an immediate ",[1096,1261,1262],{},"ArrayIndexOutOfBoundsException",") — exactly the missing-base-case bug from Lesson 28.3.",[1088,1265,1267],{"id":1266},"merge-sort-a-third-sorting-algorithm","Merge Sort: A Third Sorting Algorithm",[1080,1269,1270,1271,1274,1275,1278,1279,1282,1283,1286,1287,1289],{},"Selection sort and insertion sort (Lesson 28.2) both cost roughly ",[1096,1272,1273],{},"n²"," in the worst case. ",[1083,1276,1277],{},"Merge sort"," is a ",[1083,1280,1281],{},"divide-and-conquer"," algorithm — like binary search, it splits the problem in half repeatedly, which makes it substantially faster on large data (roughly ",[1096,1284,1285],{},"n log n"," instead of ",[1096,1288,1273],{},"):",[1291,1292,1293,1297,1300],"ol",{},[1294,1295,1296],"li",{},"Split the array into two halves.",[1294,1298,1299],{},"Recursively sort each half (a single-element array is trivially already sorted — the base case).",[1294,1301,1302,1305],{},[1083,1303,1304],{},"Merge"," the two now-sorted halves back together, in order.",[1109,1307,1309],{"className":1111,"code":1308,"language":1113,"meta":1114,"style":1114},"public static void mergeSort(int[] elements)\n{\n    int n = elements.length;\n    int[] temp = new int[n]; \u002F\u002F scratch space used during merging\n    mergeSortHelper(elements, 0, n - 1, temp);\n}\n\nprivate static void mergeSortHelper(int[] elements, int from, int to, int[] temp)\n{\n    if (from >= to) return; \u002F\u002F base case: a range of 0 or 1 elements is already sorted\n    int middle = (from + to) \u002F 2;\n    mergeSortHelper(elements, from, middle, temp);      \u002F\u002F recursively sort the left half\n    mergeSortHelper(elements, middle + 1, to, temp);    \u002F\u002F recursively sort the right half\n    merge(elements, from, middle, to, temp);            \u002F\u002F combine the two sorted halves\n}\n",[1096,1310,1311,1316,1320,1325,1330,1335,1339,1345,1350,1354,1359,1364,1369,1374,1379],{"__ignoreMap":1114},[1118,1312,1313],{"class":1120,"line":1121},[1118,1314,1315],{},"public static void mergeSort(int[] elements)\n",[1118,1317,1318],{"class":1120,"line":1127},[1118,1319,1130],{},[1118,1321,1322],{"class":1120,"line":1133},[1118,1323,1324],{},"    int n = elements.length;\n",[1118,1326,1327],{"class":1120,"line":1139},[1118,1328,1329],{},"    int[] temp = new int[n]; \u002F\u002F scratch space used during merging\n",[1118,1331,1332],{"class":1120,"line":1145},[1118,1333,1334],{},"    mergeSortHelper(elements, 0, n - 1, temp);\n",[1118,1336,1337],{"class":1120,"line":1151},[1118,1338,1244],{},[1118,1340,1341],{"class":1120,"line":1157},[1118,1342,1344],{"emptyLinePlaceholder":1343},true,"\n",[1118,1346,1347],{"class":1120,"line":1163},[1118,1348,1349],{},"private static void mergeSortHelper(int[] elements, int from, int to, int[] temp)\n",[1118,1351,1352],{"class":1120,"line":1169},[1118,1353,1130],{},[1118,1355,1356],{"class":1120,"line":1174},[1118,1357,1358],{},"    if (from >= to) return; \u002F\u002F base case: a range of 0 or 1 elements is already sorted\n",[1118,1360,1361],{"class":1120,"line":1180},[1118,1362,1363],{},"    int middle = (from + to) \u002F 2;\n",[1118,1365,1366],{"class":1120,"line":1185},[1118,1367,1368],{},"    mergeSortHelper(elements, from, middle, temp);      \u002F\u002F recursively sort the left half\n",[1118,1370,1371],{"class":1120,"line":1191},[1118,1372,1373],{},"    mergeSortHelper(elements, middle + 1, to, temp);    \u002F\u002F recursively sort the right half\n",[1118,1375,1376],{"class":1120,"line":1196},[1118,1377,1378],{},"    merge(elements, from, middle, to, temp);            \u002F\u002F combine the two sorted halves\n",[1118,1380,1381],{"class":1120,"line":1202},[1118,1382,1244],{},[1080,1384,1385,1388,1389,1392],{},[1096,1386,1387],{},"merge"," itself isn't recursive — it's the ordinary loop-based step that does the actual combining, using ",[1096,1390,1391],{},"temp"," as scratch space so it isn't overwriting the very values it still needs to compare:",[1109,1394,1396],{"className":1111,"code":1395,"language":1113,"meta":1114,"style":1114},"private static void merge(int[] elements, int from, int mid, int to, int[] temp)\n{\n    int i = from;     \u002F\u002F next unmerged element in the left half\n    int j = mid + 1;  \u002F\u002F next unmerged element in the right half\n    int k = from;      \u002F\u002F next open slot in temp\n\n    while (i \u003C= mid && j \u003C= to)\n    {\n        if (elements[i] \u003C= elements[j])\n        {\n            temp[k++] = elements[i++];\n        }\n        else\n        {\n            temp[k++] = elements[j++];\n        }\n    }\n    while (i \u003C= mid)   \u002F\u002F copy over whatever's left of the left half\n    {\n        temp[k++] = elements[i++];\n    }\n    while (j \u003C= to)    \u002F\u002F copy over whatever's left of the right half\n    {\n        temp[k++] = elements[j++];\n    }\n    for (int m = from; m \u003C= to; m++) \u002F\u002F copy the merged range back into elements\n    {\n        elements[m] = temp[m];\n    }\n}\n",[1096,1397,1398,1403,1407,1412,1417,1422,1426,1431,1435,1440,1445,1450,1455,1460,1464,1469,1473,1477,1482,1486,1491,1495,1500,1505,1511,1516,1522,1527,1533,1538],{"__ignoreMap":1114},[1118,1399,1400],{"class":1120,"line":1121},[1118,1401,1402],{},"private static void merge(int[] elements, int from, int mid, int to, int[] temp)\n",[1118,1404,1405],{"class":1120,"line":1127},[1118,1406,1130],{},[1118,1408,1409],{"class":1120,"line":1133},[1118,1410,1411],{},"    int i = from;     \u002F\u002F next unmerged element in the left half\n",[1118,1413,1414],{"class":1120,"line":1139},[1118,1415,1416],{},"    int j = mid + 1;  \u002F\u002F next unmerged element in the right half\n",[1118,1418,1419],{"class":1120,"line":1145},[1118,1420,1421],{},"    int k = from;      \u002F\u002F next open slot in temp\n",[1118,1423,1424],{"class":1120,"line":1151},[1118,1425,1344],{"emptyLinePlaceholder":1343},[1118,1427,1428],{"class":1120,"line":1157},[1118,1429,1430],{},"    while (i \u003C= mid && j \u003C= to)\n",[1118,1432,1433],{"class":1120,"line":1163},[1118,1434,1142],{},[1118,1436,1437],{"class":1120,"line":1169},[1118,1438,1439],{},"        if (elements[i] \u003C= elements[j])\n",[1118,1441,1442],{"class":1120,"line":1174},[1118,1443,1444],{},"        {\n",[1118,1446,1447],{"class":1120,"line":1180},[1118,1448,1449],{},"            temp[k++] = elements[i++];\n",[1118,1451,1452],{"class":1120,"line":1185},[1118,1453,1454],{},"        }\n",[1118,1456,1457],{"class":1120,"line":1191},[1118,1458,1459],{},"        else\n",[1118,1461,1462],{"class":1120,"line":1196},[1118,1463,1444],{},[1118,1465,1466],{"class":1120,"line":1202},[1118,1467,1468],{},"            temp[k++] = elements[j++];\n",[1118,1470,1471],{"class":1120,"line":1208},[1118,1472,1454],{},[1118,1474,1475],{"class":1120,"line":1213},[1118,1476,1154],{},[1118,1478,1479],{"class":1120,"line":1219},[1118,1480,1481],{},"    while (i \u003C= mid)   \u002F\u002F copy over whatever's left of the left half\n",[1118,1483,1484],{"class":1120,"line":1224},[1118,1485,1142],{},[1118,1487,1488],{"class":1120,"line":1230},[1118,1489,1490],{},"        temp[k++] = elements[i++];\n",[1118,1492,1493],{"class":1120,"line":1236},[1118,1494,1154],{},[1118,1496,1497],{"class":1120,"line":1241},[1118,1498,1499],{},"    while (j \u003C= to)    \u002F\u002F copy over whatever's left of the right half\n",[1118,1501,1503],{"class":1120,"line":1502},23,[1118,1504,1142],{},[1118,1506,1508],{"class":1120,"line":1507},24,[1118,1509,1510],{},"        temp[k++] = elements[j++];\n",[1118,1512,1514],{"class":1120,"line":1513},25,[1118,1515,1154],{},[1118,1517,1519],{"class":1120,"line":1518},26,[1118,1520,1521],{},"    for (int m = from; m \u003C= to; m++) \u002F\u002F copy the merged range back into elements\n",[1118,1523,1525],{"class":1120,"line":1524},27,[1118,1526,1142],{},[1118,1528,1530],{"class":1120,"line":1529},28,[1118,1531,1532],{},"        elements[m] = temp[m];\n",[1118,1534,1536],{"class":1120,"line":1535},29,[1118,1537,1154],{},[1118,1539,1541],{"class":1120,"line":1540},30,[1118,1542,1244],{},[1080,1544,1545,1547,1548,1551,1552,1555,1556,1558,1559,1561,1562,1565,1566,1568],{},[1096,1546,1387],{}," walks both sorted halves with two pointers (",[1096,1549,1550],{},"i"," for the left half, ",[1096,1553,1554],{},"j"," for the right), always taking the smaller of the two elements it's currently pointing at into ",[1096,1557,1391],{},". Once one half runs out, whatever's left of the other half is already in order, so it just gets copied straight over. The last step copies the merged range from ",[1096,1560,1391],{}," back into ",[1096,1563,1564],{},"elements",", since ",[1096,1567,1564],{}," is the array being sorted in place.",[1080,1570,1571,1572,1575],{},"Tracing the split-then-merge structure for ",[1096,1573,1574],{},"{86, 3, 43, 5}",", using nested braces:",[1109,1577,1582],{"className":1578,"code":1580,"language":1581},[1579],"language-text","Split:  { {86, 3} , {43, 5} }\nSplit:  { { {86}, {3} } , { {43}, {5} } }   \u003C- single elements: base case reached\nMerge:  { {3, 86} , {5, 43} }\nMerge:  { 3, 5, 43, 86 }\n","text",[1096,1583,1580],{"__ignoreMap":1114},[1080,1585,1586,1587,1589],{},"Like selection sort, merge sort's structure doesn't depend on the input's initial order — it always splits and merges the same way. But because its divide-and-conquer approach scales so much better than ",[1096,1588,1273],{}," sorting, it's the fastest of the three algorithms in this curriculum, most of the time, especially as the data set grows.",[1088,1591,1593],{"id":1592},"iterative-vs-recursive-same-algorithm-different-shape","Iterative vs. Recursive: Same Algorithm, Different Shape",[1080,1595,1596,1597,1599],{},"Binary search exists in both forms (Lesson 28.1's iterative version, this lesson's recursive one) — a good concrete reminder of Lesson 28.3's point that many algorithms can be written either way. Iteration is usually preferred in real code (no risk of ",[1096,1598,1258],{},", generally a bit more efficient) — but a recursive version can be more compact and can make a divide-and-conquer structure (like merge sort's) much more natural to express than an iterative equivalent would be.",[1080,1601,1602],{},[1603,1604,1605,1606,1609,1610,1613,1614,1617,1618,1621],"em",{},"(Aside: like Lesson 28.1's ",[1096,1607,1608],{},"(left + right) \u002F 2",", this lesson's ",[1096,1611,1612],{},"(start + end) \u002F 2"," and ",[1096,1615,1616],{},"(from + to) \u002F 2"," have the same theoretical overflow-safe alternative, ",[1096,1619,1620],{},"left + (right - left) \u002F 2",".)",[1088,1623,1625],{"id":1624},"common-pitfalls","Common Pitfalls",[1627,1628,1629,1635,1644],"ul",{},[1294,1630,1631,1634],{},[1083,1632,1633],{},"Forgetting either base case in recursive binary search."," Both the \"found it\" and \"range exhausted\" cases are needed — missing the exhausted-range check risks infinite recursion on a not-found search.",[1294,1636,1637,1640,1641,1643],{},[1083,1638,1639],{},"Merging without first ensuring both halves are actually sorted."," Merge sort's ",[1096,1642,1387],{}," step assumes its two inputs are already individually sorted — that's exactly what the recursive calls before it guarantee.",[1294,1645,1646,1649],{},[1083,1647,1648],{},"Assuming recursive is always \"better\" than iterative, or vice versa."," Each has real tradeoffs (stack depth risk vs. code clarity) — the right choice depends on the specific algorithm and data size.",[1088,1651,1653],{"id":1652},"key-takeaways","Key Takeaways",[1627,1655,1656,1659,1662,1671],{},[1294,1657,1658],{},"Recursive binary search replaces loop-tracked bounds with a shrinking range passed as parameters, and needs two base cases: a match, or an exhausted range.",[1294,1660,1661],{},"Merge sort is a recursive, divide-and-conquer sort: split in half, recursively sort each half (base case: 1 element), then merge the sorted halves back together.",[1294,1663,1664,1665,1667,1668,1670],{},"Merge sort scales better than selection\u002Finsertion sort on large data (",[1096,1666,1285],{}," vs. ",[1096,1669,1273],{},"), and its performance doesn't depend on the input's initial order.",[1294,1672,1673],{},"The same algorithm can often be written iteratively or recursively — the choice is a real tradeoff, not a universal \"better\" answer either way.",[1080,1675,1676,1677,1680,1681,1684],{},"Derived from ",[1096,1678,1679],{},"csawesome-2026",": ",[1096,1682,1683],{},"unit-4-data-collections\u002F4.17-recursive-searching-and-sorting.md"," (CSA 4.17)",[1686,1687,1688],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":1114,"searchDepth":1127,"depth":1127,"links":1690},[1691,1692,1693,1694,1695],{"id":1090,"depth":1127,"text":1091},{"id":1266,"depth":1127,"text":1267},{"id":1592,"depth":1127,"text":1593},{"id":1624,"depth":1127,"text":1625},{"id":1652,"depth":1127,"text":1653},"⚠ Optional chapter. Combines Lessons 28.1-28.3: the same searching\u002Fsorting ideas, rewritten recursively.","md",{"outlineRef":1699,"status":1700},"28.4 — Recursive Searching and Sorting (CSA 4.17)","new — authored lesson",{"title":322,"description":1696},"ojiDXTkcnpIAzlAaeKYaJ1oTU1sXBpqXSLlrKt01YKw",{"id":1704,"title":751,"body":1705,"description":1114,"extension":1697,"meta":2300,"navigation":1343,"path":750,"seo":2303,"stem":752,"__hash__":2304},"examples\u002Fshockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F28.4-recursive-searching-and-sorting.md",{"type":1073,"value":1706,"toc":2291},[1707,1710,1714,1717,1721,1743,1752,1756,1847,1858,1873,1877,1959,1976,1980,2090,2102,2106,2120,2135,2138,2144,2152,2230,2248,2252,2289],[1076,1708,751],{"id":1709},"recursive-searching-and-sorting-worked-example",[1088,1711,1713],{"id":1712},"problem","Problem",[1080,1715,1716],{},"The shooter's lookup table stores its RPM setpoints in a sorted array. Use recursive binary search to find where 4000 RPM is stored and to confirm that 2750 RPM isn't in the table, tracing every recursive call. Then trace how merge sort splits and merges a separate, unsorted list of four practice-shot RPM readings.",[1088,1718,1720],{"id":1719},"step-1-plan-it-first","Step 1: Plan It First",[1291,1722,1723,1734,1737,1740],{},[1294,1724,1725,1726,1729,1730,1733],{},"Recursive binary search: pass the range ",[1096,1727,1728],{},"start","..",[1096,1731,1732],{},"end"," as parameters, and halve it with each call.",[1294,1735,1736],{},"It needs two base cases: an empty range (not found) and a match at the middle.",[1294,1738,1739],{},"Trace a search that finds its target and a search that doesn't.",[1294,1741,1742],{},"Merge sort: split down to single elements (the base case), then merge the sorted halves back together.",[1109,1744,1746],{"className":1111,"code":1745,"language":1113,"meta":1114,"style":1114},"int[] rpmTable = {1500, 2000, 2500, 3000, 3500, 4000, 4500};\n",[1096,1747,1748],{"__ignoreMap":1114},[1118,1749,1750],{"class":1120,"line":1121},[1118,1751,1745],{},[1088,1753,1755],{"id":1754},"step-2-write-the-recursive-binary-search","Step 2: Write the Recursive Binary Search",[1109,1757,1759],{"className":1111,"code":1758,"language":1113,"meta":1114,"style":1114},"public static int findSetpoint(int[] table, int start, int end, int target)\n{\n    if (end \u003C start)                  \u002F\u002F base case 1: empty range — not found\n    {\n        return -1;\n    }\n    int middle = (start + end) \u002F 2;\n    if (target == table[middle])      \u002F\u002F base case 2: found it\n    {\n        return middle;\n    }\n    else if (target \u003C table[middle])\n    {\n        return findSetpoint(table, start, middle - 1, target); \u002F\u002F left half\n    }\n    else\n    {\n        return findSetpoint(table, middle + 1, end, target);   \u002F\u002F right half\n    }\n}\n",[1096,1760,1761,1766,1770,1775,1779,1783,1787,1791,1796,1800,1804,1808,1813,1817,1822,1826,1830,1834,1839,1843],{"__ignoreMap":1114},[1118,1762,1763],{"class":1120,"line":1121},[1118,1764,1765],{},"public static int findSetpoint(int[] table, int start, int end, int target)\n",[1118,1767,1768],{"class":1120,"line":1127},[1118,1769,1130],{},[1118,1771,1772],{"class":1120,"line":1133},[1118,1773,1774],{},"    if (end \u003C start)                  \u002F\u002F base case 1: empty range — not found\n",[1118,1776,1777],{"class":1120,"line":1139},[1118,1778,1142],{},[1118,1780,1781],{"class":1120,"line":1145},[1118,1782,1148],{},[1118,1784,1785],{"class":1120,"line":1151},[1118,1786,1154],{},[1118,1788,1789],{"class":1120,"line":1157},[1118,1790,1160],{},[1118,1792,1793],{"class":1120,"line":1163},[1118,1794,1795],{},"    if (target == table[middle])      \u002F\u002F base case 2: found it\n",[1118,1797,1798],{"class":1120,"line":1169},[1118,1799,1142],{},[1118,1801,1802],{"class":1120,"line":1174},[1118,1803,1177],{},[1118,1805,1806],{"class":1120,"line":1180},[1118,1807,1154],{},[1118,1809,1810],{"class":1120,"line":1185},[1118,1811,1812],{},"    else if (target \u003C table[middle])\n",[1118,1814,1815],{"class":1120,"line":1191},[1118,1816,1142],{},[1118,1818,1819],{"class":1120,"line":1196},[1118,1820,1821],{},"        return findSetpoint(table, start, middle - 1, target); \u002F\u002F left half\n",[1118,1823,1824],{"class":1120,"line":1202},[1118,1825,1154],{},[1118,1827,1828],{"class":1120,"line":1208},[1118,1829,1216],{},[1118,1831,1832],{"class":1120,"line":1213},[1118,1833,1142],{},[1118,1835,1836],{"class":1120,"line":1219},[1118,1837,1838],{},"        return findSetpoint(table, middle + 1, end, target);   \u002F\u002F right half\n",[1118,1840,1841],{"class":1120,"line":1224},[1118,1842,1154],{},[1118,1844,1845],{"class":1120,"line":1230},[1118,1846,1244],{},[1080,1848,1849,1850,1853,1854,1857],{},"The first call covers the whole array, indexes ",[1096,1851,1852],{},"0"," through ",[1096,1855,1856],{},"rpmTable.length - 1",":",[1109,1859,1861],{"className":1111,"code":1860,"language":1113,"meta":1114,"style":1114},"System.out.println(findSetpoint(rpmTable, 0, rpmTable.length - 1, 4000)); \u002F\u002F 5\nSystem.out.println(findSetpoint(rpmTable, 0, rpmTable.length - 1, 2750)); \u002F\u002F -1\n",[1096,1862,1863,1868],{"__ignoreMap":1114},[1118,1864,1865],{"class":1120,"line":1121},[1118,1866,1867],{},"System.out.println(findSetpoint(rpmTable, 0, rpmTable.length - 1, 4000)); \u002F\u002F 5\n",[1118,1869,1870],{"class":1120,"line":1127},[1118,1871,1872],{},"System.out.println(findSetpoint(rpmTable, 0, rpmTable.length - 1, 2750)); \u002F\u002F -1\n",[1088,1874,1876],{"id":1875},"step-3-trace-a-search-that-finds-its-target-4000","Step 3: Trace a Search That Finds Its Target (4000)",[1878,1879,1880,1911],"table",{},[1881,1882,1883],"thead",{},[1884,1885,1886,1890,1894,1898,1903,1908],"tr",{},[1887,1888,1889],"th",{},"Call",[1887,1891,1892],{},[1096,1893,1728],{},[1887,1895,1896],{},[1096,1897,1732],{},[1887,1899,1900],{},[1096,1901,1902],{},"middle",[1887,1904,1905],{},[1096,1906,1907],{},"table[middle]",[1887,1909,1910],{},"What happens",[1912,1913,1914,1936],"tbody",{},[1884,1915,1916,1922,1924,1927,1930,1933],{},[1917,1918,1919],"td",{},[1096,1920,1921],{},"findSetpoint(rpmTable, 0, 6, 4000)",[1917,1923,1852],{},[1917,1925,1926],{},"6",[1917,1928,1929],{},"3",[1917,1931,1932],{},"3000",[1917,1934,1935],{},"4000 > 3000, so call on the right half",[1884,1937,1938,1943,1946,1948,1951,1954],{},[1917,1939,1940],{},[1096,1941,1942],{},"findSetpoint(rpmTable, 4, 6, 4000)",[1917,1944,1945],{},"4",[1917,1947,1926],{},[1917,1949,1950],{},"5",[1917,1952,1953],{},"4000",[1917,1955,1956,1957],{},"match (base case 2), return ",[1096,1958,1950],{},[1080,1960,1961,1962,1964,1965,1968,1969,1971,1972,1975],{},"The second call returns ",[1096,1963,1950],{}," to the first call. The first call was executing ",[1096,1966,1967],{},"return findSetpoint(...)",", so it passes that same ",[1096,1970,1950],{}," straight back to ",[1096,1973,1974],{},"main",".",[1088,1977,1979],{"id":1978},"step-4-trace-a-search-that-doesnt-find-its-target-2750","Step 4: Trace a Search That Doesn't Find Its Target (2750)",[1878,1981,1982,2006],{},[1881,1983,1984],{},[1884,1985,1986,1988,1992,1996,2000,2004],{},[1887,1987,1889],{},[1887,1989,1990],{},[1096,1991,1728],{},[1887,1993,1994],{},[1096,1995,1732],{},[1887,1997,1998],{},[1096,1999,1902],{},[1887,2001,2002],{},[1096,2003,1907],{},[1887,2005,1910],{},[1912,2007,2008,2026,2047,2066],{},[1884,2009,2010,2015,2017,2019,2021,2023],{},[1917,2011,2012],{},[1096,2013,2014],{},"findSetpoint(rpmTable, 0, 6, 2750)",[1917,2016,1852],{},[1917,2018,1926],{},[1917,2020,1929],{},[1917,2022,1932],{},[1917,2024,2025],{},"2750 \u003C 3000, so call on the left half",[1884,2027,2028,2033,2035,2038,2041,2044],{},[1917,2029,2030],{},[1096,2031,2032],{},"findSetpoint(rpmTable, 0, 2, 2750)",[1917,2034,1852],{},[1917,2036,2037],{},"2",[1917,2039,2040],{},"1",[1917,2042,2043],{},"2000",[1917,2045,2046],{},"2750 > 2000, so call on the right half",[1884,2048,2049,2054,2056,2058,2060,2063],{},[1917,2050,2051],{},[1096,2052,2053],{},"findSetpoint(rpmTable, 2, 2, 2750)",[1917,2055,2037],{},[1917,2057,2037],{},[1917,2059,2037],{},[1917,2061,2062],{},"2500",[1917,2064,2065],{},"2750 > 2500, so call on the right half",[1884,2067,2068,2073,2075,2077,2080,2082],{},[1917,2069,2070],{},[1096,2071,2072],{},"findSetpoint(rpmTable, 3, 2, 2750)",[1917,2074,1929],{},[1917,2076,2037],{},[1917,2078,2079],{},"—",[1917,2081,2079],{},[1917,2083,2084,2086,2087],{},[1096,2085,1254],{}," (base case 1), return ",[1096,2088,2089],{},"-1",[1080,2091,2092,2093,2095,2096,2098,2099,2101],{},"The fourth call's range starts at 3 and ends at 2, so it's empty. This is where the ",[1096,2094,1254],{}," check matters. Without it, the method would keep computing a ",[1096,2097,1902],{}," and recursing into ranges that hold nothing. That ",[1096,2100,2089],{}," is passed back up through all three waiting calls.",[1088,2103,2105],{"id":2104},"step-5-trace-merge-sort","Step 5: Trace Merge Sort",[1080,2107,2108,2109,2112,2113,2116,2117,2119],{},"Now sort four practice-shot readings with the lesson's ",[1096,2110,2111],{},"mergeSort",". Its ",[1096,2114,2115],{},"mergeSortHelper"," sorts the left half, then the right half, then calls ",[1096,2118,1387],{}," to combine them:",[1109,2121,2123],{"className":1111,"code":2122,"language":1113,"meta":1114,"style":1114},"int[] shotRpms = {3000, 700, 4800, 1200};\nmergeSort(shotRpms);\n",[1096,2124,2125,2130],{"__ignoreMap":1114},[1118,2126,2127],{"class":1120,"line":1121},[1118,2128,2129],{},"int[] shotRpms = {3000, 700, 4800, 1200};\n",[1118,2131,2132],{"class":1120,"line":1127},[1118,2133,2134],{},"mergeSort(shotRpms);\n",[1080,2136,2137],{},"Split and merge, using the same nested-brace notation as the lesson:",[1109,2139,2142],{"className":2140,"code":2141,"language":1581},[1579],"Split:  { {3000, 700} , {4800, 1200} }\nSplit:  { { {3000}, {700} } , { {4800}, {1200} } }   \u003C- single elements: base case reached\nMerge:  { {700, 3000} , {1200, 4800} }\nMerge:  { 700, 1200, 3000, 4800 }\n",[1096,2143,2141],{"__ignoreMap":1114},[1080,2145,2146,2148,2149,2151],{},[1096,2147,2115],{}," finishes the entire left half before it starts on the right half. So the three ",[1096,2150,1387],{}," calls happen in this order, and the array (sorted in place) looks like this after each one:",[1878,2153,2154,2172],{},[1881,2155,2156],{},[1884,2157,2158,2163,2166],{},[1887,2159,2160,2162],{},[1096,2161,1387],{}," call",[1887,2164,2165],{},"Range merged",[1887,2167,2168,2171],{},[1096,2169,2170],{},"shotRpms"," afterward",[1912,2173,2174,2194,2212],{},[1884,2175,2176,2178,2189],{},[1917,2177,2040],{},[1917,2179,2180,2181,2184,2185,2188],{},"indexes 0-1 (",[1096,2182,2183],{},"{3000}"," + ",[1096,2186,2187],{},"{700}",")",[1917,2190,2191],{},[1096,2192,2193],{},"{700, 3000, 4800, 1200}",[1884,2195,2196,2198,2207],{},[1917,2197,2037],{},[1917,2199,2200,2201,2184,2204,2188],{},"indexes 2-3 (",[1096,2202,2203],{},"{4800}",[1096,2205,2206],{},"{1200}",[1917,2208,2209],{},[1096,2210,2211],{},"{700, 3000, 1200, 4800}",[1884,2213,2214,2216,2225],{},[1917,2215,1929],{},[1917,2217,2218,2219,2184,2222,2188],{},"indexes 0-3 (",[1096,2220,2221],{},"{700, 3000}",[1096,2223,2224],{},"{1200, 4800}",[1917,2226,2227],{},[1096,2228,2229],{},"{700, 1200, 3000, 4800}",[1080,2231,2232,2233,2236,2237,2240,2241,2243,2244,2247],{},"The final merge takes values from both halves in turn: ",[1096,2234,2235],{},"700"," from the left, ",[1096,2238,2239],{},"1200"," from the right, ",[1096,2242,1932],{}," from the left, then ",[1096,2245,2246],{},"4800"," from the right. That only works because both halves were already sorted when it started. Guaranteeing that is the job of the two recursive calls.",[1088,2249,2251],{"id":2250},"recap","Recap",[1627,2253,2254,2271,2280,2283,2286],{},[1294,2255,2256,2257,2259,2260,2262,2263,1099,2265,2267,2268,2270],{},"Recursive binary search passes the shrinking range (",[1096,2258,1728],{},", ",[1096,2261,1732],{},") as parameters. That range plays the same role the ",[1096,2264,1098],{},[1096,2266,1102],{}," loop variables and ",[1096,2269,1106],{}," condition play in the iterative version.",[1294,2272,2273,2274,2276,2277,2279],{},"It needs both base cases: a match at ",[1096,2275,1902],{},", and an empty range (",[1096,2278,1254],{},") for a target that isn't there.",[1294,2281,2282],{},"Each recursive call returns its result straight back up to the call that made it.",[1294,2284,2285],{},"Merge sort splits down to single elements (already sorted, the base case), sorts the left half completely, then the right half, and only then merges them.",[1294,2287,2288],{},"The merge step depends on both halves already being sorted, which is exactly what the recursive calls before it guarantee.",[1686,2290,1688],{},{"title":1114,"searchDepth":1127,"depth":1127,"links":2292},[2293,2294,2295,2296,2297,2298,2299],{"id":1712,"depth":1127,"text":1713},{"id":1719,"depth":1127,"text":1720},{"id":1754,"depth":1127,"text":1755},{"id":1875,"depth":1127,"text":1876},{"id":1978,"depth":1127,"text":1979},{"id":2104,"depth":1127,"text":2105},{"id":2250,"depth":1127,"text":2251},{"outlineRef":1699,"pairsWith":2301,"status":2302},"[`lessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.4-recursive-searching-and-sorting.md`](..\u002F..\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.4-recursive-searching-and-sorting.md)","new — authored worked example (fully solved, walked step by step — not a problem to attempt)",{"title":751,"description":1114},"5ivHU_-7Ndw2eyKm-BCoBKFf8j5P-vqZkqbwUM53wWk",{"id":2306,"title":1068,"body":2307,"description":1114,"extension":1697,"meta":3212,"navigation":1343,"path":1067,"seo":3214,"stem":1069,"__hash__":3215},"exercises\u002Fshockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F28.4-recursive-searching-and-sorting.md",{"type":1073,"value":2308,"toc":3207},[2309,2312,2316,2335,2350,2355,2381,2387,2429,2459,2463,2516,2519,2569,2574,2580,2663,2767,2771,2777,2813,2827,2851,2860,2865,2901,2906,3042,3047,3156,3205],[1076,2310,1068],{"id":2311},"recursive-searching-and-sorting-exercises",[1088,2313,2315],{"id":2314},"multiple-choice","Multiple Choice",[1080,2317,2318,2321,2322,2324,2325,2327,2328,2331,2332,2334],{},[1083,2319,2320],{},"Question:"," The lesson's ",[1096,2323,2111],{}," is called on an array of intake current spikes (in amps). ",[1096,2326,2115],{}," sorts the left half, then the right half, then merges them. What does the array look like right ",[1083,2329,2330],{},"before"," the final ",[1096,2333,1387],{}," call, the one that combines indexes 0-1 with indexes 2-3?",[1109,2336,2338],{"className":1111,"code":2337,"language":1113,"meta":1114,"style":1114},"int[] currentSpikes = {9, 4, 7, 1};\nmergeSort(currentSpikes);\n",[1096,2339,2340,2345],{"__ignoreMap":1114},[1118,2341,2342],{"class":1120,"line":1121},[1118,2343,2344],{},"int[] currentSpikes = {9, 4, 7, 1};\n",[1118,2346,2347],{"class":1120,"line":1127},[1118,2348,2349],{},"mergeSort(currentSpikes);\n",[1080,2351,2352],{},[1083,2353,2354],{},"Options:",[1627,2356,2357,2363,2369,2375],{},[1294,2358,2359,2360],{},"A. ",[1096,2361,2362],{},"{9, 4, 7, 1}",[1294,2364,2365,2366],{},"B. ",[1096,2367,2368],{},"{4, 9, 7, 1}",[1294,2370,2371,2372],{},"C. ",[1096,2373,2374],{},"{4, 9, 1, 7}",[1294,2376,2377,2378],{},"D. ",[1096,2379,2380],{},"{1, 4, 7, 9}",[1080,2382,2383,2386],{},[1083,2384,2385],{},"Answer:"," C",[1080,2388,2389,2392,2393,2395,2396,2399,2400,1613,2403,2406,2407,2410,2411,2399,2414,1613,2417,2406,2420,2423,2424,2426,2427,1975],{},[1083,2390,2391],{},"Why:"," Before the final merge can run, ",[1096,2394,2115],{}," has already finished both of its recursive calls. The left-half call split ",[1096,2397,2398],{},"{9, 4}"," into ",[1096,2401,2402],{},"{9}",[1096,2404,2405],{},"{4}"," and merged them into ",[1096,2408,2409],{},"{4, 9}",". Then the right-half call split ",[1096,2412,2413],{},"{7, 1}",[1096,2415,2416],{},"{7}",[1096,2418,2419],{},"{1}",[1096,2421,2422],{},"{1, 7}",". The array is sorted in place, so it now reads ",[1096,2425,2374],{},": each half is sorted on its own, but the whole array isn't sorted yet. The final merge's job is to combine them into ",[1096,2428,2380],{},[1627,2430,2431,2434,2452],{},[1294,2432,2433],{},"A is wrong. That's the array before any work at all. The merges of the single-element halves happen during the recursive calls, before the final merge.",[1294,2435,2436,2437,2439,2440,2442,2443,2445,2446,2448,2449,2451],{},"B is wrong. That's the state after only the left half is sorted. ",[1096,2438,2115],{}," makes the right-half call ",[1603,2441,2330],{}," it calls ",[1096,2444,1387],{},", so ",[1096,2447,2413],{}," is already sorted into ",[1096,2450,2422],{}," by the time the final merge starts.",[1294,2453,2454,2455,2458],{},"D is wrong. That's the finished result, which only exists ",[1603,2456,2457],{},"after"," the final merge. If the array were already fully sorted, the final merge would have nothing to do.",[1088,2460,2462],{"id":2461},"micro-parsons","Micro-Parsons",[1080,2464,2465,2468,2469,2472,2473,2475,2476,2479,2480,2483,2484,2487,2488,2491,2492,2494,2495,2497,2498,1729,2500,2502,2503,1099,2506,2509,2510,2512,2513,1975],{},[1083,2466,2467],{},"Problem:"," Given an ",[1096,2470,2471],{},"ElevatorPresets"," class whose ",[1096,2474,1974],{}," method creates the sorted array ",[1096,2477,2478],{},"int[] presetHeights = {20, 45, 80, 110, 150};"," and prints ",[1096,2481,2482],{},"findPreset(presetHeights, 0, presetHeights.length - 1, 110)",", reorder the fragments below into the complete recursive binary search method ",[1096,2485,2486],{},"findPreset",". It must return the index of ",[1096,2489,2490],{},"target",", or ",[1096,2493,2089],{}," if ",[1096,2496,2490],{}," isn't in the range ",[1096,2499,1728],{},[1096,2501,1732],{},". The single-statement ",[1096,2504,2505],{},"if",[1096,2507,2508],{},"else"," branches are written without braces here, like the lesson's ",[1096,2511,2115],{}," writes ",[1096,2514,2515],{},"if (from >= to) return;",[1080,2517,2518],{},"Reorder the fragments below into a working method:",[1627,2520,2521,2527,2533,2539,2545,2551,2557,2563],{},[1294,2522,2523,2524],{},"a. ",[1096,2525,2526],{},"    int middle = (start + end) \u002F 2;",[1294,2528,2529,2530],{},"b. ",[1096,2531,2532],{},"    else return findPreset(presets, middle + 1, end, target);",[1294,2534,2535,2536],{},"c. ",[1096,2537,2538],{},"public static int findPreset(int[] presets, int start, int end, int target)",[1294,2540,2541,2542],{},"d. ",[1096,2543,2544],{},"    if (target == presets[middle]) return middle;",[1294,2546,2547,2548],{},"e. ",[1096,2549,2550],{},"}",[1294,2552,2553,2554],{},"f. ",[1096,2555,2556],{},"    if (end \u003C start) return -1;",[1294,2558,2559,2560],{},"g. ",[1096,2561,2562],{},"    else if (target \u003C presets[middle]) return findPreset(presets, start, middle - 1, target);",[1294,2564,2565,2566],{},"h. ",[1096,2567,2568],{},"{",[1080,2570,2571,2573],{},[1083,2572,2385],{}," c, h, f, a, d, g, b, e",[1080,2575,2576,2579],{},[1083,2577,2578],{},"Interchangeable:"," (f, a)",[1109,2581,2583],{"className":1111,"code":2582,"language":1113,"meta":1114,"style":1114},"public class ElevatorPresets\n{\n    public static int findPreset(int[] presets, int start, int end, int target)\n    {\n        if (end \u003C start) return -1;\n        int middle = (start + end) \u002F 2;\n        if (target == presets[middle]) return middle;\n        else if (target \u003C presets[middle]) return findPreset(presets, start, middle - 1, target);\n        else return findPreset(presets, middle + 1, end, target);\n    }\n\n    public static void main(String[] args)\n    {\n        int[] presetHeights = {20, 45, 80, 110, 150};\n        System.out.println(findPreset(presetHeights, 0, presetHeights.length - 1, 110));\n    }\n}\n",[1096,2584,2585,2590,2594,2599,2603,2608,2613,2618,2623,2628,2632,2636,2641,2645,2650,2655,2659],{"__ignoreMap":1114},[1118,2586,2587],{"class":1120,"line":1121},[1118,2588,2589],{},"public class ElevatorPresets\n",[1118,2591,2592],{"class":1120,"line":1127},[1118,2593,1130],{},[1118,2595,2596],{"class":1120,"line":1133},[1118,2597,2598],{},"    public static int findPreset(int[] presets, int start, int end, int target)\n",[1118,2600,2601],{"class":1120,"line":1139},[1118,2602,1142],{},[1118,2604,2605],{"class":1120,"line":1145},[1118,2606,2607],{},"        if (end \u003C start) return -1;\n",[1118,2609,2610],{"class":1120,"line":1151},[1118,2611,2612],{},"        int middle = (start + end) \u002F 2;\n",[1118,2614,2615],{"class":1120,"line":1157},[1118,2616,2617],{},"        if (target == presets[middle]) return middle;\n",[1118,2619,2620],{"class":1120,"line":1163},[1118,2621,2622],{},"        else if (target \u003C presets[middle]) return findPreset(presets, start, middle - 1, target);\n",[1118,2624,2625],{"class":1120,"line":1169},[1118,2626,2627],{},"        else return findPreset(presets, middle + 1, end, target);\n",[1118,2629,2630],{"class":1120,"line":1174},[1118,2631,1154],{},[1118,2633,2634],{"class":1120,"line":1180},[1118,2635,1344],{"emptyLinePlaceholder":1343},[1118,2637,2638],{"class":1120,"line":1185},[1118,2639,2640],{},"    public static void main(String[] args)\n",[1118,2642,2643],{"class":1120,"line":1191},[1118,2644,1142],{},[1118,2646,2647],{"class":1120,"line":1196},[1118,2648,2649],{},"        int[] presetHeights = {20, 45, 80, 110, 150};\n",[1118,2651,2652],{"class":1120,"line":1202},[1118,2653,2654],{},"        System.out.println(findPreset(presetHeights, 0, presetHeights.length - 1, 110));\n",[1118,2656,2657],{"class":1120,"line":1208},[1118,2658,1154],{},[1118,2660,2661],{"class":1120,"line":1213},[1118,2662,1244],{},[1080,2664,2665,2668,2669,2672,2673,2676,2677,2680,2681,2683,2684,2687,2688,2690,2691,2693,2694,2696,2697,2700,2701,2703,2704,2445,2707,2709,2710,2712,2713,1613,2715,2712,2717,2719,2720,2722,2723,2725,2726,2728,2729,2732,2733,2736,2737,2732,2739,2742,2743,2745,2746,1099,2748,2750,2751,2753,2754,2757,2758,2760,2761,1565,2763,2766],{},[1083,2666,2667],{},"Why this order:"," The signature (",[1096,2670,2671],{},"c",") and opening brace (",[1096,2674,2675],{},"h",") come first. The empty-range base case (",[1096,2678,2679],{},"f",") and the ",[1096,2682,1902],{}," calculation (",[1096,2685,2686],{},"a",") come next, in either order. Computing ",[1096,2689,1902],{}," is only arithmetic and never reads the array, so doing it before or after the ",[1096,2692,1254],{}," check doesn't change the result. The lesson checks the base case first, which is why the Answer lists ",[1096,2695,2679],{}," first. Both of them have to come before the match check (",[1096,2698,2699],{},"d","), for two reasons. ",[1096,2702,2699],{}," reads ",[1096,2705,2706],{},"presets[middle]",[1096,2708,1902],{}," has to exist already. And on an empty range (for example, a search of an empty array, where ",[1096,2711,1728],{}," is ",[1096,2714,1852],{},[1096,2716,1732],{},[1096,2718,2089],{},"), reading ",[1096,2721,2706],{}," before returning ",[1096,2724,2089],{}," would go outside the array. The match check (",[1096,2727,2699],{},") is the second base case. The two recursive calls follow as the ",[1096,2730,2731],{},"else if"," (",[1096,2734,2735],{},"g",") and then the ",[1096,2738,2508],{},[1096,2740,2741],{},"b","), since an ",[1096,2744,2508],{}," only attaches to an ",[1096,2747,2505],{},[1096,2749,2731],{}," directly above it. Each call passes a range that leaves out ",[1096,2752,1902],{},", so the range always shrinks toward one of the two base cases. The method's brace (",[1096,2755,2756],{},"e",") closes last. The class and ",[1096,2759,1974],{}," are the given scaffold. The finished program prints ",[1096,2762,1929],{},[1096,2764,2765],{},"110"," is at index 3.",[1088,2768,2770],{"id":2769},"coding","Coding",[1080,2772,2773,2776],{},[1083,2774,2775],{},"Mode:"," harness",[1080,2778,2779,2781,2782,2785,2786,2789,2790,2793,2794,2797,2798,2800,2801,2803,2804,2806,2807,2809,2810,2812],{},[1083,2780,2467],{}," Write a ",[1083,2783,2784],{},"recursive"," binary search over a ",[1096,2787,2788],{},"String[]"," of subsystem names that is\nalready sorted alphabetically (compare with ",[1096,2791,2792],{},"compareTo",", not ",[1096,2795,2796],{},"\u003C","). The search looks only at the\nindices from ",[1096,2799,1728],{}," to ",[1096,2802,1732],{},", inclusive. Return the index where ",[1096,2805,2490],{}," is found, or ",[1096,2808,2089],{}," if it\nisn't in that range. Names are unique. A call with ",[1096,2811,1254],{}," means the range is empty.",[1080,2814,2815,2816,2819,2820,2823,2824,1289],{},"Examples (with ",[1096,2817,2818],{},"names"," = ",[1096,2821,2822],{},"{\"Climber\", \"Drive\", \"Intake\", \"Shooter\"}"," and the whole range ",[1096,2825,2826],{},"0, 3",[1627,2828,2829,2837,2844],{},[1294,2830,2831,2834,2835],{},[1096,2832,2833],{},"recursiveSearch(names, 0, 3, \"Intake\")"," returns ",[1096,2836,2037],{},[1294,2838,2839,2834,2842],{},[1096,2840,2841],{},"recursiveSearch(names, 0, 3, \"Drive\")",[1096,2843,2040],{},[1294,2845,2846,2834,2849],{},[1096,2847,2848],{},"recursiveSearch(names, 0, 3, \"Zebra\")",[1096,2850,2089],{},[1080,2852,2853,2856,2857],{},[1083,2854,2855],{},"Signature:"," ",[1096,2858,2859],{},"public static int recursiveSearch(String[] sortedNames, int start, int end, String target)",[1080,2861,2862],{},[1083,2863,2864],{},"Starter:",[1109,2866,2868],{"className":1111,"code":2867,"language":1113,"meta":1114,"style":1114},"public class Solution\n{\n    public static int recursiveSearch(String[] sortedNames, int start, int end, String target)\n    {\n        \u002F\u002F TODO: two base cases, then search the correct half recursively\n    }\n}\n",[1096,2869,2870,2875,2879,2884,2888,2893,2897],{"__ignoreMap":1114},[1118,2871,2872],{"class":1120,"line":1121},[1118,2873,2874],{},"public class Solution\n",[1118,2876,2877],{"class":1120,"line":1127},[1118,2878,1130],{},[1118,2880,2881],{"class":1120,"line":1133},[1118,2882,2883],{},"    public static int recursiveSearch(String[] sortedNames, int start, int end, String target)\n",[1118,2885,2886],{"class":1120,"line":1139},[1118,2887,1142],{},[1118,2889,2890],{"class":1120,"line":1145},[1118,2891,2892],{},"        \u002F\u002F TODO: two base cases, then search the correct half recursively\n",[1118,2894,2895],{"class":1120,"line":1151},[1118,2896,1154],{},[1118,2898,2899],{"class":1120,"line":1157},[1118,2900,1244],{},[1080,2902,2903],{},[1083,2904,2905],{},"Tests:",[1878,2907,2908,2921],{},[1881,2909,2910],{},[1884,2911,2912,2915,2918],{},[1887,2913,2914],{},"Visible",[1887,2916,2917],{},"Arguments",[1887,2919,2920],{},"Expected",[1912,2922,2923,2937,2950,2963,2977,2990,3003,3016,3029],{},[1884,2924,2925,2928,2933],{},[1917,2926,2927],{},"yes",[1917,2929,2930],{},[1096,2931,2932],{},"new String[] {\"Climber\", \"Drive\", \"Intake\", \"Shooter\"}, 0, 3, \"Intake\"",[1917,2934,2935],{},[1096,2936,2037],{},[1884,2938,2939,2941,2946],{},[1917,2940,2927],{},[1917,2942,2943],{},[1096,2944,2945],{},"new String[] {\"Climber\", \"Drive\", \"Intake\", \"Shooter\"}, 0, 3, \"Drive\"",[1917,2947,2948],{},[1096,2949,2040],{},[1884,2951,2952,2954,2959],{},[1917,2953,2927],{},[1917,2955,2956],{},[1096,2957,2958],{},"new String[] {\"Climber\", \"Drive\", \"Intake\", \"Shooter\"}, 0, 3, \"Zebra\"",[1917,2960,2961],{},[1096,2962,2089],{},[1884,2964,2965,2968,2973],{},[1917,2966,2967],{},"no",[1917,2969,2970],{},[1096,2971,2972],{},"new String[] {\"Climber\", \"Drive\", \"Intake\", \"Shooter\"}, 0, 3, new String(\"Drive\")",[1917,2974,2975],{},[1096,2976,2040],{},[1884,2978,2979,2981,2986],{},[1917,2980,2967],{},[1917,2982,2983],{},[1096,2984,2985],{},"new String[] {\"Climber\", \"Drive\", \"Intake\", \"Shooter\"}, 0, 3, \"Climber\"",[1917,2987,2988],{},[1096,2989,1852],{},[1884,2991,2992,2994,2999],{},[1917,2993,2967],{},[1917,2995,2996],{},[1096,2997,2998],{},"new String[] {\"Climber\", \"Drive\", \"Intake\", \"Shooter\"}, 0, 3, \"Shooter\"",[1917,3000,3001],{},[1096,3002,1929],{},[1884,3004,3005,3007,3012],{},[1917,3006,2967],{},[1917,3008,3009],{},[1096,3010,3011],{},"new String[] {\"Climber\", \"Drive\", \"Intake\", \"Shooter\"}, 0, 3, \"Elevator\"",[1917,3013,3014],{},[1096,3015,2089],{},[1884,3017,3018,3020,3025],{},[1917,3019,2967],{},[1917,3021,3022],{},[1096,3023,3024],{},"new String[] {\"Climber\", \"Drive\", \"Intake\", \"Shooter\"}, 0, 3, \"Aardvark\"",[1917,3026,3027],{},[1096,3028,2089],{},[1884,3030,3031,3033,3038],{},[1917,3032,2967],{},[1917,3034,3035],{},[1096,3036,3037],{},"new String[] {}, 0, -1, \"Drive\"",[1917,3039,3040],{},[1096,3041,2089],{},[1080,3043,3044],{},[1083,3045,3046],{},"Solution:",[1109,3048,3050],{"className":1111,"code":3049,"language":1113,"meta":1114,"style":1114},"public class Solution\n{\n    public static int recursiveSearch(String[] sortedNames, int start, int end, String target)\n    {\n        if (end \u003C start)\n        {\n            return -1;\n        }\n        int middle = (start + end) \u002F 2;\n        int order = target.compareTo(sortedNames[middle]);\n        if (order == 0)\n        {\n            return middle;\n        }\n        else if (order \u003C 0)\n        {\n            return recursiveSearch(sortedNames, start, middle - 1, target);\n        }\n        else\n        {\n            return recursiveSearch(sortedNames, middle + 1, end, target);\n        }\n    }\n}\n",[1096,3051,3052,3056,3060,3064,3068,3073,3077,3082,3086,3090,3095,3100,3104,3109,3113,3118,3122,3127,3131,3135,3139,3144,3148,3152],{"__ignoreMap":1114},[1118,3053,3054],{"class":1120,"line":1121},[1118,3055,2874],{},[1118,3057,3058],{"class":1120,"line":1127},[1118,3059,1130],{},[1118,3061,3062],{"class":1120,"line":1133},[1118,3063,2883],{},[1118,3065,3066],{"class":1120,"line":1139},[1118,3067,1142],{},[1118,3069,3070],{"class":1120,"line":1145},[1118,3071,3072],{},"        if (end \u003C start)\n",[1118,3074,3075],{"class":1120,"line":1151},[1118,3076,1444],{},[1118,3078,3079],{"class":1120,"line":1157},[1118,3080,3081],{},"            return -1;\n",[1118,3083,3084],{"class":1120,"line":1163},[1118,3085,1454],{},[1118,3087,3088],{"class":1120,"line":1169},[1118,3089,2612],{},[1118,3091,3092],{"class":1120,"line":1174},[1118,3093,3094],{},"        int order = target.compareTo(sortedNames[middle]);\n",[1118,3096,3097],{"class":1120,"line":1180},[1118,3098,3099],{},"        if (order == 0)\n",[1118,3101,3102],{"class":1120,"line":1185},[1118,3103,1444],{},[1118,3105,3106],{"class":1120,"line":1191},[1118,3107,3108],{},"            return middle;\n",[1118,3110,3111],{"class":1120,"line":1196},[1118,3112,1454],{},[1118,3114,3115],{"class":1120,"line":1202},[1118,3116,3117],{},"        else if (order \u003C 0)\n",[1118,3119,3120],{"class":1120,"line":1208},[1118,3121,1444],{},[1118,3123,3124],{"class":1120,"line":1213},[1118,3125,3126],{},"            return recursiveSearch(sortedNames, start, middle - 1, target);\n",[1118,3128,3129],{"class":1120,"line":1219},[1118,3130,1454],{},[1118,3132,3133],{"class":1120,"line":1224},[1118,3134,1459],{},[1118,3136,3137],{"class":1120,"line":1230},[1118,3138,1444],{},[1118,3140,3141],{"class":1120,"line":1236},[1118,3142,3143],{},"            return recursiveSearch(sortedNames, middle + 1, end, target);\n",[1118,3145,3146],{"class":1120,"line":1241},[1118,3147,1454],{},[1118,3149,3150],{"class":1120,"line":1502},[1118,3151,1154],{},[1118,3153,3154],{"class":1120,"line":1507},[1118,3155,1244],{},[1080,3157,3158,3160,3161,3164,3165,3167,3168,3170,3171,3173,3174,3176,3177,3179,3180,3183,3184,3187,3188,1286,3191,3193,3194,3197,3198,3201,3202,3204],{},[1083,3159,2391],{}," The shrinking range ",[1096,3162,3163],{},"start..end"," does the job the ",[1096,3166,1106],{}," loop's condition did in the\niterative version. There are two base cases: an empty range (",[1096,3169,1254],{},") means the target isn't\nthere, and a match at ",[1096,3172,1902],{}," returns its index. ",[1096,3175,2792],{}," returns zero for equal text, negative\nif ",[1096,3178,2490],{}," sorts before the middle name (search the left half, ",[1096,3181,3182],{},"middle - 1","), and positive if after\n(search the right half, ",[1096,3185,3186],{},"middle + 1","). Comparing the names with ",[1096,3189,3190],{},"==",[1096,3192,2792],{}," happens to\nwork for string literals but fails for a ",[1096,3195,3196],{},"String"," that was built separately, as the\n",[1096,3199,3200],{},"new String(\"Drive\")"," test shows. Leaving out the ",[1096,3203,1254],{}," base case makes a search for a missing\nname recurse until it crashes.",[1686,3206,1688],{},{"title":1114,"searchDepth":1127,"depth":1127,"links":3208},[3209,3210,3211],{"id":2314,"depth":1127,"text":2315},{"id":2461,"depth":1127,"text":2462},{"id":2769,"depth":1127,"text":2770},{"outlineRef":1699,"pairsWith":2301,"status":3213},"new — authored exercises (Multiple Choice + Micro-Parsons + Coding)",{"title":1068,"description":1114},"ICWh89Di2KoRze8z-vBSteWjIrvhJuWMEmCQG8iJzKo",1792718167020]