1 00:00:00,000 --> 00:00:10,550 2 00:00:10,550 --> 00:00:14,050 >> DAVID J. MALAN: Dit is CS50 en dit is die begin van die week vier. 3 00:00:14,050 --> 00:00:18,630 En, seun, is Volkswagen in moeilikheid alles as gevolg van sagteware. 4 00:00:18,630 --> 00:00:20,264 Kom ons neem 'n blik. 5 00:00:20,264 --> 00:00:20,930 [Video speel] 6 00:00:20,930 --> 00:00:25,560 -Cars, Die slimste karakters in die Fast and Furious films. 7 00:00:25,560 --> 00:00:29,100 Hierdie week Duitse automaker Volkswagen self gevind 8 00:00:29,100 --> 00:00:32,490 in die middel van 'n skandaal van potensieel kriminele proporsies. 9 00:00:32,490 --> 00:00:36,060 >> -Volkswagen Is versterkend vir miljarde in boetes, moontlike kriminele aanklagte 10 00:00:36,060 --> 00:00:38,560 vir sy bestuurders, as die maatskappy vra om verskoning 11 00:00:38,560 --> 00:00:41,840 vir rigging 11.000.000 motors help klop uitstoot toetse. 12 00:00:41,840 --> 00:00:44,950 >> -Certain Diesel modelle was ontwerp met gesofistikeerde sagteware 13 00:00:44,950 --> 00:00:48,440 wat gebruik word om inligting, insluitend die posisie van die stuurwiel en die voertuig 14 00:00:48,440 --> 00:00:51,870 spoed te bepaal die motor was ondergaan uitstoot toets. 15 00:00:51,870 --> 00:00:55,650 Onder daardie omstandighede, die enjin sou giftige uitlaatgasse te verminder. 16 00:00:55,650 --> 00:00:59,070 Maar die motor is getuig te omseil dat wanneer dit was gedryf. 17 00:00:59,070 --> 00:01:03,320 Uitstoot verhoog 10-40 keer bo aanvaarbare vlakke EPA. 18 00:01:03,320 --> 00:01:04,280 >> [Einde afspeel] 19 00:01:04,280 --> 00:01:05,220 >> DAVID J. MALAN: So laat neem 'n blik op hierdie 20 00:01:05,220 --> 00:01:07,250 en sien presies hoe dit kan geïmplementeer word 21 00:01:07,250 --> 00:01:09,680 en hoe dit kan beïnvloed so baie motors soos hierdie. 22 00:01:09,680 --> 00:01:12,840 So in my hand hier is die pers vrylating wat uitgereik is deur die EPA-- 23 00:01:12,840 --> 00:01:14,620 die Omgewing Protection Agency wat 24 00:01:14,620 --> 00:01:18,032 is die VSA regulerende agentskap wat hanteer die omgewing betref, 25 00:01:18,032 --> 00:01:19,740 en dan die werklike legal notice wat 26 00:01:19,740 --> 00:01:22,420 stuur na Volkswagen net 'n paar dae gelede. 27 00:01:22,420 --> 00:01:26,530 >> So het die EPA skryf, en openbaar nou openbaar, 'n gesofistikeerde sagteware 28 00:01:26,530 --> 00:01:29,390 algoritme op sekere Volkswagen voertuie ontdek 29 00:01:29,390 --> 00:01:32,630 wanneer die motor ondergaan amptelike uitstoot toets 30 00:01:32,630 --> 00:01:36,505 en draai volle uitstoot beheer oor slegs tydens die toets. 31 00:01:36,505 --> 00:01:38,380 Die doeltreffendheid van hierdie voertuie besoedeling 32 00:01:38,380 --> 00:01:43,260 uitstoot beheer toestelle is baie verminder tydens al normale ry 33 00:01:43,260 --> 00:01:44,320 situasies. 34 00:01:44,320 --> 00:01:48,190 Dit lei in 'n motor wat aan die standaarde in die laboratorium of toetsing 35 00:01:48,190 --> 00:01:52,790 stasie, maar tydens normale werking uitstraal stikstof oxides-- of NOx-- 36 00:01:52,790 --> 00:01:54,950 by tot 40 keer die standaard. 37 00:01:54,950 --> 00:01:58,220 Die sagteware wat deur Volkswagen is 'n aanhaling unquote, nederlaag toestel 38 00:01:58,220 --> 00:02:00,650 soos gedefinieer deur die Skoon Air Wet in die VSA. 39 00:02:00,650 --> 00:02:03,410 >> Hulle gaan om te sê dat die EPA en ander agentskap 40 00:02:03,410 --> 00:02:07,020 ontbloot die nederlaag toestel sagteware na onafhanklike ontleding 41 00:02:07,020 --> 00:02:09,660 deur navorsers by West Virginia University. 42 00:02:09,660 --> 00:02:14,160 NOx besoedeling bydra tot stikstofdioksied, grondvlak osoon, 43 00:02:14,160 --> 00:02:15,700 en fyn deeltjies. 44 00:02:15,700 --> 00:02:18,090 Blootstelling aan hierdie besoedelingstowwe is gekoppel 45 00:02:18,090 --> 00:02:20,870 met 'n wye verskeidenheid van ernstige gevolge vir die gesondheid, 46 00:02:20,870 --> 00:02:23,637 insluitende 'n groter asma aanvalle en ander respiratoriese 47 00:02:23,637 --> 00:02:26,470 siektes wat kan ernstig genoeg om mense te stuur na die hospitaal. 48 00:02:26,470 --> 00:02:28,660 Blootstelling aan osoon en deeltjies het ook 49 00:02:28,660 --> 00:02:31,960 wat verband hou met voortydige dood as gevolg van respiratoriese verwante 50 00:02:31,960 --> 00:02:35,690 of kardiovaskulêre verwant effekte. 51 00:02:35,690 --> 00:02:38,940 Kinders, bejaardes, mense met preexisting respiratoriese siekte 52 00:02:38,940 --> 00:02:42,840 is veral 'n risiko vir gevolge vir die gesondheid van die besoedeling. 53 00:02:42,840 --> 00:02:45,056 >> Voldoende is om te sê, dit is baie ernstig. 54 00:02:45,056 --> 00:02:46,930 En laat ons gaan op om te lees net nog 'n uittreksel 55 00:02:46,930 --> 00:02:49,370 en dan sal ons 'n blik op te neem die onderliggende implikasies 56 00:02:49,370 --> 00:02:50,920 van hierdie in die konteks van 'n motor. 57 00:02:50,920 --> 00:02:53,730 Spesifiek, Volkswagen vervaardig en geïnstalleer 58 00:02:53,730 --> 00:02:56,210 sagteware in die sogenaamde elektroniese beheer 59 00:02:56,210 --> 00:02:59,320 module-- of ECM-- van hierdie voertuie wat aangevoel 60 00:02:59,320 --> 00:03:03,580 wanneer die voertuig getoets vir nakoming EPA emissie standaarde. 61 00:03:03,580 --> 00:03:07,510 Gebaseer op verskeie insette insluitend die posisie van die stuurwiel, voertuig 62 00:03:07,510 --> 00:03:11,280 spoed, die duur van die enjin se operasie, en barometriese druk, 63 00:03:11,280 --> 00:03:13,720 hierdie insette juis nagespoor die parameters 64 00:03:13,720 --> 00:03:17,600 van die federale toets prosedure vir toetsing vir EPA sertifisering emissie 65 00:03:17,600 --> 00:03:18,400 doeleindes. 66 00:03:18,400 --> 00:03:21,850 >> Gedurende emissie toets EPA se die voertuie ECM sagteware 67 00:03:21,850 --> 00:03:25,060 hardloop sagteware wat geproduseer voldoen uitstoot resultate. 68 00:03:25,060 --> 00:03:28,340 Alle ander tye, die voertuig ECM sagteware 69 00:03:28,340 --> 00:03:31,090 hardloop 'n aparte pad kalibrasie wat verminder 70 00:03:31,090 --> 00:03:34,360 die doeltreffendheid van die algehele vrystelling beheer stelsel, 71 00:03:34,360 --> 00:03:37,864 spesifiek die selektiewe katalitiese vermindering van die Lean NOx trap-- 72 00:03:37,864 --> 00:03:39,280 wat ons sal sien oor in 'n oomblik. 73 00:03:39,280 --> 00:03:43,040 As gevolg hiervan, die vrystelling van NOx verhoog deur 'n faktor 10 tot 40 keer 74 00:03:43,040 --> 00:03:47,450 bo die EPA voldoen vlakke afhangende van die tipe van ry siklus. 75 00:03:47,450 --> 00:03:50,800 >> So, wat dit regtig beteken, en die bronkode om die sagteware loop 76 00:03:50,800 --> 00:03:53,190 op die Volkswagen se het nie nog openbaar gemaak, 77 00:03:53,190 --> 00:03:56,460 is dat, effektief, hierdie ekwivalent is daar iewers in 78 00:03:56,460 --> 00:03:57,830 Volkswagen se kode. 79 00:03:57,830 --> 00:04:02,200 As jy word getoets, en as die motor sekere omgewingsfaktore ontdek 80 00:04:02,200 --> 00:04:04,330 soos die stuurwiel posisie of die beweging 81 00:04:04,330 --> 00:04:06,710 of die gebrek daaraan van die motor of enige aantal ander faktore 82 00:04:06,710 --> 00:04:09,940 wat tans vermoed om deel van hierdie formule wees, 83 00:04:09,940 --> 00:04:12,370 hulle eenvoudig draai op volle uitstoot beheer. 84 00:04:12,370 --> 00:04:15,670 Met ander woorde, hulle begin afgee minder van die besoedeling. 85 00:04:15,670 --> 00:04:18,769 >> Anders, in elke ander situasie wanneer dit nie opgespoor word as 86 00:04:18,769 --> 00:04:20,790 in die laboratorium, het hulle net nie doen nie. 87 00:04:20,790 --> 00:04:24,320 En so kan jy dit vereenvoudig in meer beton pseudokode met iets 88 00:04:24,320 --> 00:04:24,820 soos hierdie. 89 00:04:24,820 --> 00:04:27,810 As die wiele draai, maar die stuurwiel is nie, suggestief 90 00:04:27,810 --> 00:04:30,060 dat die motor is op 'n paar soort roterende silinder 91 00:04:30,060 --> 00:04:32,550 maar in 'n soort van pakhuis getoets, 92 00:04:32,550 --> 00:04:36,070 tree dan as die EPA wil jy. 93 00:04:36,070 --> 00:04:37,960 Anders doen nie. 94 00:04:37,960 --> 00:04:40,420 So laat ons 'n blik op 'n kort video wat 95 00:04:40,420 --> 00:04:45,391 neem 'n blik op wat die implikasies is van hierdie eintlik meganies. 96 00:04:45,391 --> 00:04:48,620 >> [Video speel] 97 00:04:48,620 --> 00:04:52,800 >> -Last Vrydag die EPA aangekondig dat sommige Volkswagen Audi motors tussen 2009 98 00:04:52,800 --> 00:04:55,840 en hierdie jaar is die gebruik van 'n sogenaamde nederlaag toestel 99 00:04:55,840 --> 00:04:59,060 om te kry om die uitstoot wette ontwerp om die lug skoon te hou. 100 00:04:59,060 --> 00:05:01,700 Maar wat beteken dit presies? 101 00:05:01,700 --> 00:05:04,666 >> Wel, moderne motors het dekades van rekenaars in hulle. 102 00:05:04,666 --> 00:05:07,040 En sommige van die rekenaars help koördineer die funksies 103 00:05:07,040 --> 00:05:09,590 van die enjin vir optimum prestasie, terwyl om seker te maak 104 00:05:09,590 --> 00:05:12,340 dat daar nie te veel vullis uit te kom van die uitlaatpyp. 105 00:05:12,340 --> 00:05:15,170 Hulle het eintlik is besig hierdie manier vir 'n paar dekades. 106 00:05:15,170 --> 00:05:17,380 Basies, elke deel van die enjin 'n moderne motor se 107 00:05:17,380 --> 00:05:20,080 het 'n sensor of beheerder op dit, en hierdie rekenaars 108 00:05:20,080 --> 00:05:23,460 lees in die data duisende keer per sekonde maak aanpassings 109 00:05:23,460 --> 00:05:26,220 soos die verhouding van brandstof na die lug wat gaan in die silinders. 110 00:05:26,220 --> 00:05:28,730 >> Hierdie verneuk Volkswagen en Audi-modelle is diesels, 111 00:05:28,730 --> 00:05:30,890 en diesels het nog ' werklik belangrik rekenaar 112 00:05:30,890 --> 00:05:34,030 beheer parameters, wat die bedrag van die onverbrande brandstof gaan 113 00:05:34,030 --> 00:05:35,200 in die uitlaat. 114 00:05:35,200 --> 00:05:36,310 Nou dit klink sleg. 115 00:05:36,310 --> 00:05:39,642 Klink nie soos jy graag wil hê onverbrande brandstof gaan in die uitlaat. 116 00:05:39,642 --> 00:05:41,600 Maar in die geval van 'n diesel, jy iets 117 00:05:41,600 --> 00:05:46,110 bekend as 'n NOx trap wat is 'n toestel wat absorbeer en 'n strik vir stikstofoksiede 118 00:05:46,110 --> 00:05:48,880 dat besoedeling is wat sou anders gaan in die atmosfeer. 119 00:05:48,880 --> 00:05:53,040 En die effek van daardie NOx trap is versterk met onverbrande brandstof. 120 00:05:53,040 --> 00:05:56,650 So 'n nederlaag toestel is 'n spesiale program binne hierdie rekenaars wat dit kan maak 121 00:05:56,650 --> 00:05:59,527 lyk soos die motor aan emissie standaarde, selfs wanneer dit nie. 122 00:05:59,527 --> 00:06:01,110 Volkswagen het 'n probleem op sy hande. 123 00:06:01,110 --> 00:06:04,050 Sy diesel enjins is bekend vir die kry groot brandstofverbruik, 124 00:06:04,050 --> 00:06:07,510 maar die NOx trap werk net goed wanneer meer brandstof gebruik word. 125 00:06:07,510 --> 00:06:10,460 So het die motor sou opspoor, die gebruik van hierdie nederlaag toestel 126 00:06:10,460 --> 00:06:13,870 wanneer dit was om 'n uitstoot toets, sou dit meer brandstof gebruik, 127 00:06:13,870 --> 00:06:16,830 maak die NOx trap werk goed, uitstoot sal goed wees. 128 00:06:16,830 --> 00:06:21,130 Maar dan kry jy op die pad, die toestel draai af, jy brand minder brandstof 129 00:06:21,130 --> 00:06:24,256 maar jy sit so veel as 40 keer meer besoedelingstowwe in die atmosfeer. 130 00:06:24,256 --> 00:06:26,130 Maar hoe die heck het die motor weet dat dit was 131 00:06:26,130 --> 00:06:27,720 getoets vir uitstoot nakoming? 132 00:06:27,720 --> 00:06:30,590 Die EPA sê dit was 'n gesofistikeerde stelsel wat dinge nagegaan 133 00:06:30,590 --> 00:06:34,090 soos stuurwiel posisie, spoed, hoe lank die enjin was, 134 00:06:34,090 --> 00:06:35,507 en selfs die atmosferiese druk. 135 00:06:35,507 --> 00:06:37,673 Met ander woorde, daar was geen manier toevallige was hierdie 136 00:06:37,673 --> 00:06:40,260 omdat die sagteware was ontwerp baie versigtig te spoor 137 00:06:40,260 --> 00:06:41,630 'n amptelike toets uitstoot. 138 00:06:41,630 --> 00:06:43,588 Dit is 'n paar mooi ernstige misleiding en dit is 139 00:06:43,588 --> 00:06:45,420 hoekom Volkswagen is in so 'n ernstige moeilikheid. 140 00:06:45,420 --> 00:06:48,600 In werklikheid, hul uitvoerende hoof, Martin Winterkorn, net uitgetree. 141 00:06:48,600 --> 00:06:49,820 >> So wat gebeur volgende? 142 00:06:49,820 --> 00:06:53,900 Wel, as jy een van die half miljoen diesel Jettas, Beatles, Golfs, Passats, 143 00:06:53,900 --> 00:06:56,220 of Audi A3s bewerkstellig, die goeie nuus is, is 144 00:06:56,220 --> 00:06:57,886 dat jou motor is nog veilig om te ry. 145 00:06:57,886 --> 00:07:00,510 Jy hoef nie om dit weg te sit totdat Volkswagen reik 'n herroeping. 146 00:07:00,510 --> 00:07:02,509 Maar op 'n sekere punt hulle is waarskynlik gaan hê 147 00:07:02,509 --> 00:07:04,230 om die sagteware in jou motor te werk. 148 00:07:04,230 --> 00:07:06,927 Wanneer dit gebeur jy dalk kry minder myl per tenk. 149 00:07:06,927 --> 00:07:09,260 Prokureurs is reeds gereed vir klas-aksie regsgedinge 150 00:07:09,260 --> 00:07:12,500 so eienaars kan kry vergoed op 'n sekere punt in die toekoms. 151 00:07:12,500 --> 00:07:15,832 Maar dit is nie van plan om gebeur nie enige tyd gou. 152 00:07:15,832 --> 00:07:16,711 >> [Einde afspeel] 153 00:07:16,711 --> 00:07:19,960 DAVID J. MALAN: So dit is eintlik verhoog 'n interessante groter prentjie vraag 154 00:07:19,960 --> 00:07:20,660 as om te vertrou. 155 00:07:20,660 --> 00:07:21,160 Reg? 156 00:07:21,160 --> 00:07:24,300 Almal van ons het iPhones of Androids of iets in ons sakke waarskynlik 157 00:07:24,300 --> 00:07:26,500 hierdie dae, of skootrekenaars op ons rondtes wat 158 00:07:26,500 --> 00:07:28,510 hardloop sagteware gemaak deur Apple en Microsoft 159 00:07:28,510 --> 00:07:30,710 en trosse van ander maatskappye. 160 00:07:30,710 --> 00:07:34,240 Maar hoe weet ons dat dit wat hierdie sagteware produkte doen 161 00:07:34,240 --> 00:07:37,680 is eintlik wat hierdie maatskappye sê hulle doen? 162 00:07:37,680 --> 00:07:39,610 >> Byvoorbeeld, wat om te sê dat elke keer as jy 163 00:07:39,610 --> 00:07:42,200 maak 'n oproep op jou iPhone of Android-selfoon of die wil, 164 00:07:42,200 --> 00:07:45,650 dat telefoonnommer is ook nie word opgelaai na bediener paar maatskappy se 165 00:07:45,650 --> 00:07:48,399 as gevolg van 'n program wat jy het geskryf, of dit nou die bedryfstelsel 166 00:07:48,399 --> 00:07:51,070 stelsel self soos IOS of Android, of omdat jy afgelaai 167 00:07:51,070 --> 00:07:53,880 sommige derde party app wat een of ander manier is om te luister 168 00:07:53,880 --> 00:07:57,120 alles wat jy tik in of alles wat jy eintlik sê. 169 00:07:57,120 --> 00:07:59,500 Hoe weet jy dat wanneer julle ouens loop klang 170 00:07:59,500 --> 00:08:02,590 of maak om op te stel jou eie sagteware in CS50, hoe 171 00:08:02,590 --> 00:08:06,080 doen jy eie personeel se CS50, deur middel van die CS50 biblioteek, 172 00:08:06,080 --> 00:08:08,690 is nie 'meld elke string wat jy al ooit gekry 173 00:08:08,690 --> 00:08:10,276 of elke duim wat jy nog ooit gekry? 174 00:08:10,276 --> 00:08:12,900 Wel, jy kan beslis kyk by die bron-kode vir iets 175 00:08:12,900 --> 00:08:15,233 soos die CS50 biblioteek, jy kan kyk na die bronkode 176 00:08:15,233 --> 00:08:18,170 vir Linux bedryfstelsel loop op CS50 IDE. 177 00:08:18,170 --> 00:08:23,090 Maar 'n ongelooflike aanbieding gegee terug in 1984 178 00:08:23,090 --> 00:08:26,730 in die ontvangs van die Turing-toekenning deur 'n baie bekende rekenaar wetenskaplike bekend 179 00:08:26,730 --> 00:08:29,750 as-- naam Ken Thompson wat ontvang die Turing-toekenning wat 180 00:08:29,750 --> 00:08:33,500 is 'n soort van die rekenaar wetenskap se Nobelprys, as jy wil, 181 00:08:33,500 --> 00:08:35,309 vir sy werk op 'n bedryfstelsel genoem 182 00:08:35,309 --> 00:08:39,039 Unix, wat baie soortgelyk in gees wat ons gebruik wat Linux. 183 00:08:39,039 --> 00:08:41,960 En die vraag gevra wat hy in sy aanvaarding toespraak, in wese 184 00:08:41,960 --> 00:08:44,910 gehou die raamwerk vir jare en jare van bespreking 185 00:08:44,910 --> 00:08:46,970 oor vertroue en sekuriteit, was hierdie. 186 00:08:46,970 --> 00:08:50,410 Tot watter mate moet 'n mens 'n trust stelling dat 'n program-- 'n stuk 187 00:08:50,410 --> 00:08:53,010 van software-- is gratis Trojaanse perde? 188 00:08:53,010 --> 00:08:56,500 Miskien is dit is meer belangrik om te vertrou die mense wat die sagteware geskryf het. 189 00:08:56,500 --> 00:08:58,650 >> En in die feit, het ons verbind om die gesprek dat hy 190 00:08:58,650 --> 00:09:02,400 gegee het toe aanvaar hierdie toekenning in die 80's op die webwerf CS50 se 191 00:09:02,400 --> 00:09:04,030 onder die bladsy Lesings vir vandag. 192 00:09:04,030 --> 00:09:06,071 Want wat jy sien is dat hy eintlik gee 193 00:09:06,071 --> 00:09:09,430 'n redelik eenvoudige voorbeeld van hoe selfs 'n samesteller soos klang of wat ook al 194 00:09:09,430 --> 00:09:13,950 opstellers ander gebruik het in die verlede, wat as ingebed in die samesteller ons 195 00:09:13,950 --> 00:09:18,190 onsself gebruik is 'n bietjie as voorwaarde wat in wese sê, 196 00:09:18,190 --> 00:09:22,360 as jy sien dat hierdie kode gebruik die GetString funksie of die GetInt 197 00:09:22,360 --> 00:09:26,600 funksie, gaan voort en voeg 'n agterdeur of 'n Trojaanse perd 198 00:09:26,600 --> 00:09:29,340 sodanig dat die program het nou 'n paar nulle 199 00:09:29,340 --> 00:09:30,930 en diegene wat iets kwaadwillige doen. 200 00:09:30,930 --> 00:09:33,080 Meld al jou toetsaanslagen, oplaai dat data 201 00:09:33,080 --> 00:09:35,100 sommige bediener, of regtig iets. 202 00:09:35,100 --> 00:09:37,290 >> En wat Ken Thompson gaan voort om te doen in sy praatjie 203 00:09:37,290 --> 00:09:40,580 is om aan te toon dat selfs as jy toegang tot die bron het 204 00:09:40,580 --> 00:09:43,794 kode van 'n samesteller wat kwaadwillig kan dit doen, 205 00:09:43,794 --> 00:09:46,210 dit nie omdat saak daar is hierdie hoender en die eier 206 00:09:46,210 --> 00:09:49,500 werklikheid van die verlede baie jaar waardeur opstellers 207 00:09:49,500 --> 00:09:51,960 word gebruik om hulself op te stel. 208 00:09:51,960 --> 00:09:55,440 Met ander woorde, die pad terug wanneer iemand het geskryf het die eerste samesteller. 209 00:09:55,440 --> 00:09:59,060 En daarna, enige tyd wat hulle het verander 'n samesteller deur die verandering van die bron-kode, 210 00:09:59,060 --> 00:10:02,020 die toevoeging van funksies en hercompileren dit vir mense soos ons om te gebruik, goed, 211 00:10:02,020 --> 00:10:04,270 hulle gebruik die ou weergawe van die samesteller 212 00:10:04,270 --> 00:10:06,370 om die nuwe stel weergawe van die samesteller. 213 00:10:06,370 --> 00:10:08,370 En as jy 'n blik by die sprake dat hy, 214 00:10:08,370 --> 00:10:10,970 jy sal sien dat omdat van daardie sirkulariteit, 215 00:10:10,970 --> 00:10:14,330 jy kan eintlik het foute of Trojaanse perde ingebed in sagteware 216 00:10:14,330 --> 00:10:14,990 ons gebruik. 217 00:10:14,990 --> 00:10:18,010 En selfs as jy kyk na die bron-kode vir die programme, 218 00:10:18,010 --> 00:10:21,550 dit kan nie eens duidelik wees omdat die bedrieëry is eintlik 219 00:10:21,550 --> 00:10:24,710 in sommige ouer weergawe van 'n samesteller wat sedertdien 220 00:10:24,710 --> 00:10:27,340 spuit die bedreiging in ons sagteware. 221 00:10:27,340 --> 00:10:29,740 >> Wat net om te sê, ons regtig kan nie en behoort nie 222 00:10:29,740 --> 00:10:32,939 trust sagteware op ons skootrekenaars of selfone of enige aantal plekke. 223 00:10:32,939 --> 00:10:36,230 En in die feit, wat later in die semester wanneer ons begin praat oor web programmering 224 00:10:36,230 --> 00:10:38,521 en eintlik begin met die bou web aansoeke onsself, 225 00:10:38,521 --> 00:10:40,285 ons sal praat oor hierdie dreigemente en ander. 226 00:10:40,285 --> 00:10:43,410 Nou, kan jy al gewonder en opgemerk dat daar 'n klein bietjie Darth 227 00:10:43,410 --> 00:10:45,842 Vader in die clips wat Die rand is daar wat 228 00:10:45,842 --> 00:10:47,550 oor Volkswagen. As jy nog nooit gesien het nie, ek 229 00:10:47,550 --> 00:10:49,190 gedink ons ​​moet verlig die bui, want dit is al 230 00:10:49,190 --> 00:10:50,780 baie neerdrukkend en skrikwekkend. 231 00:10:50,780 --> 00:10:52,910 Ek gaan om terug te kyk op Super Bowl 2011 232 00:10:52,910 --> 00:10:55,300 wanneer 'n kommersiële deur Volkswagen-- en dit 233 00:10:55,300 --> 00:10:59,620 maak byna hulle aangenaam again-- uitgesaai vir die eerste keer op TV. 234 00:10:59,620 --> 00:11:04,039 Dit is die tweede clip 60 dat ek dink jy sal geniet. 235 00:11:04,039 --> 00:11:04,705 [Video speel] 236 00:11:04,705 --> 00:11:08,198 [MUSIEK - tema uit "STAR WARS"] 237 00:11:08,198 --> 00:11:35,643 238 00:11:35,643 --> 00:11:38,138 [DOG blaf] 239 00:11:38,138 --> 00:11:50,114 240 00:11:50,114 --> 00:11:53,607 [Motor begin] 241 00:11:53,607 --> 00:12:04,086 242 00:12:04,086 --> 00:12:05,955 [Einde afspeel] 243 00:12:05,955 --> 00:12:06,830 DAVID J. MALAN: Ja. 244 00:12:06,830 --> 00:12:07,663 Ek was net te keur. 245 00:12:07,663 --> 00:12:11,360 Dat die motor is op die lys van oortredings. 246 00:12:11,360 --> 00:12:12,000 Alles reg. 247 00:12:12,000 --> 00:12:14,040 So ons kyk na 'n paar pseudokode 'n oomblik gelede. 248 00:12:14,040 --> 00:12:15,380 En hier is 'n groter uittreksel van pseudokode kode 249 00:12:15,380 --> 00:12:16,921 dat ons 'n paar keer tot dusver gesien het. 250 00:12:16,921 --> 00:12:19,970 En laat ons gebruik dit is 'n geleentheid nou 'n nuwe ontwikkeling bekend 251 00:12:19,970 --> 00:12:23,776 tegniek wat ons gedoen het sien algoritmies 252 00:12:23,776 --> 00:12:25,400 verlede week toe ons gekyk na merge soort. 253 00:12:25,400 --> 00:12:28,270 Maar laat ons formaliseer dit en sien hoe ons kan dit gebruik in die werklike kode, 254 00:12:28,270 --> 00:12:30,350 en dan gaan ons dit gebruik tegniek in die pad af die meeste 255 00:12:30,350 --> 00:12:32,000 waarskynlik sekere ander probleme op te los. 256 00:12:32,000 --> 00:12:35,790 >> So dit was een van die eerste programme wat ons ooit geskryf het, al is dit in pseudokode-kode. 257 00:12:35,790 --> 00:12:37,790 En wat hierdie program ons toegelaat om kursus 258 00:12:37,790 --> 00:12:41,510 was om Mike Smith in 'n telefoon boek. 259 00:12:41,510 --> 00:12:46,216 En let veral lyne agt en 11 wat hierdie Go To verklaring gehad het. 260 00:12:46,216 --> 00:12:48,090 En in die feit, sekere tale, C onder hulle, 261 00:12:48,090 --> 00:12:50,006 eintlik 'n stelling wat letterlik 262 00:12:50,006 --> 00:12:52,710 gaan na wat jou toelaat om spring na 'n spesifieke lyn. 263 00:12:52,710 --> 00:12:55,470 Dit is oor die algemeen afgekeur omdat dit kan baie maklik misbruik word 264 00:12:55,470 --> 00:12:58,490 en jy kan begin spring jou program oor die hele plek in teenstelling 265 00:12:58,490 --> 00:13:00,690 om die gebruik van die soort logika en die beheer vloei 266 00:13:00,690 --> 00:13:04,000 dat ons tot dusver gebruik het met net loops en voorwaardes en dies meer. 267 00:13:04,000 --> 00:13:08,660 >> Maar ons kan hierdie algoritme vereenvoudig in pseudokode kode soos volg. 268 00:13:08,660 --> 00:13:11,250 In plaas van hierdie iteratiewe of herhaling benadering 269 00:13:11,250 --> 00:13:14,160 waar ons bly om terug te gaan en terug en terug na drie lyn, 270 00:13:14,160 --> 00:13:18,300 Daarom het ons nie net soort van punt en meer algemeen sê in lyn sewe en 10, 271 00:13:18,300 --> 00:13:20,570 vervang net die twee pare lyne met, 272 00:13:20,570 --> 00:13:22,810 anders as Smith vroeër is in die boek wat ons sal 273 00:13:22,810 --> 00:13:25,110 soek Mike in die links helfte van die boek. 274 00:13:25,110 --> 00:13:28,560 Anders as Smith is later in die boek, soek Mike in die regte 275 00:13:28,560 --> 00:13:29,540 die helfte van die boek. 276 00:13:29,540 --> 00:13:31,180 En let reeds rondom die ontstaan. 277 00:13:31,180 --> 00:13:31,680 Reg? 278 00:13:31,680 --> 00:13:34,250 Ek is op soek na Mike in die telefoon boek en dan 279 00:13:34,250 --> 00:13:37,090 Ek het uiteindelik getref miskien lyn sewe of miskien lyn 10 280 00:13:37,090 --> 00:13:41,089 en my opdrag aan myself is soek vir Mike in die helfte van die telefoon boek. 281 00:13:41,089 --> 00:13:42,380 Wel, hoe kan ek soek vir Mike? 282 00:13:42,380 --> 00:13:44,213 Ek is in die middel van soek vir Mike, hoekom 283 00:13:44,213 --> 00:13:45,860 jy soort van die stuur my in 'n sirkel? 284 00:13:45,860 --> 00:13:49,590 Maar dit is OK, want wat is gebeur met die omvang van die probleem, 285 00:13:49,590 --> 00:13:52,630 soos geskryf in die lyn 7 en 10? 286 00:13:52,630 --> 00:13:54,989 Ons is nie net soek sê vir Mike, soek Mike. 287 00:13:54,989 --> 00:13:56,280 Ons spesifiek sê wat? 288 00:13:56,280 --> 00:13:58,694 289 00:13:58,694 --> 00:14:01,610 Soek hom in die linker helfte van die regter helfte wat effektief is 290 00:14:01,610 --> 00:14:03,440 die helfte van die grootte van die probleem. 291 00:14:03,440 --> 00:14:07,170 So dit is OK dat ons soort betrokke te raak in hierdie sirkulariteit, 292 00:14:07,170 --> 00:14:09,180 hierdie omsendbrief argument, want ten minste is ons 293 00:14:09,180 --> 00:14:11,090 die maak van die probleem kleiner en kleiner. 294 00:14:11,090 --> 00:14:14,220 En uiteindelik gaan ons bereik dat die sogenaamde basis geval waar 295 00:14:14,220 --> 00:14:16,780 ons het net een bladsy left-- as ons vrywilliger laaste week 296 00:14:16,780 --> 00:14:18,684 did-- ons het 'n bladsy links en dan moet ons dit nie doen nie 297 00:14:18,684 --> 00:14:21,600 te hou soek na Mike Smith want hy is óf op daardie bladsy 298 00:14:21,600 --> 00:14:23,080 of hy is nie. 299 00:14:23,080 --> 00:14:27,480 >> So, hoe kan ons hierdie idee, hierdie soort van sirkulariteit in werklike kode? 300 00:14:27,480 --> 00:14:31,030 Wel, ons kan 'n tegniek hefboom dit is algemeen bekend as rekursie. 301 00:14:31,030 --> 00:14:33,960 En ons het dit in die gesien pseudokode vir merge soort verlede week. 302 00:14:33,960 --> 00:14:37,190 Onthou dat dit was die pseudokode vir merge soort. 303 00:14:37,190 --> 00:14:40,560 Dit is waarskynlik nog makliker as borrel of keuse of invoeging soort 304 00:14:40,560 --> 00:14:43,310 net in terme van die eenvoud waarmee jy kan dit uit te druk. 305 00:14:43,310 --> 00:14:46,750 >> Maar dit is omdat ons is soort van sirkulêr 306 00:14:46,750 --> 00:14:51,350 sê, soek vir iets deur weer soek vir dit. 307 00:14:51,350 --> 00:14:53,960 Maar ons is op soek hetsy op die linker helfte of die regter helfte 308 00:14:53,960 --> 00:14:56,070 en dan uiteindelik ons samesmelting in hierdie geval. 309 00:14:56,070 --> 00:14:58,520 Maar hier, ook met daardie twee soort lyne, 310 00:14:58,520 --> 00:15:01,320 het ons dit het weer idee van rekursie. 311 00:15:01,320 --> 00:15:05,350 En konkreet wat dit beteken, in die konteks van 'n algoritme, 312 00:15:05,350 --> 00:15:10,880 is dat 'n algoritme is rekursiewe as dit gebruik of noem homself. 313 00:15:10,880 --> 00:15:14,330 >> Of in terme van C, 'n funksie is recursive-- 'n funksie genoem 314 00:15:14,330 --> 00:15:18,510 cat is rekursiewe as cat, iewers in die bron-kode, 315 00:15:18,510 --> 00:15:21,250 noem die funksie cat self. 316 00:15:21,250 --> 00:15:25,790 En dit is sleg as al cat ooit doen is noem homself weer en weer. 317 00:15:25,790 --> 00:15:30,600 Dit is OK as cat uiteindelik tot stilstand kom, net soos saamsmelt soort, deur te sê, wag 'n minuut, 318 00:15:30,600 --> 00:15:32,980 as die probleem is super klein, byvoorbeeld, 319 00:15:32,980 --> 00:15:35,840 of ek het hom gevind wie ek is soek, net terug te keer. 320 00:15:35,840 --> 00:15:41,000 Moenie rekursief nie, moenie siklies myself weer te bel. 321 00:15:41,000 --> 00:15:44,200 >> En so laat ons neem 'n blik op hoe dit eintlik kan werk. 322 00:15:44,200 --> 00:15:48,430 So ek gaan om voort te gaan en oop twee bronkode voorbeelde hier. 323 00:15:48,430 --> 00:15:50,321 Een van die sogenaamde sigma 0. 324 00:15:50,321 --> 00:15:52,320 En dit is glad nie rekursiewe, maar laat ons neem 325 00:15:52,320 --> 00:15:53,694 'n blik op wat hierdie program nie. 326 00:15:53,694 --> 00:15:55,737 Ek het uitgetrek uit al kommentaar van dit, maar almal 327 00:15:55,737 --> 00:15:58,070 van die bron-kode op CS50 se webwerf het kommentaar as jy 328 00:15:58,070 --> 00:15:59,570 wil weer later deur te lees. 329 00:15:59,570 --> 00:16:02,010 En laat ons doen 'n paar van gesonde verstand tjeks hier. 330 00:16:02,010 --> 00:16:06,640 >> So aan die bokant van hierdie kode, ons het, sluit CS50.h. 331 00:16:06,640 --> 00:16:07,650 Wat beteken dit? 332 00:16:07,650 --> 00:16:08,990 Hoekom is dit hier? 333 00:16:08,990 --> 00:16:11,740 In terme redelike leek se. 334 00:16:11,740 --> 00:16:12,424 Wat doen dit? 335 00:16:12,424 --> 00:16:12,858 Ja. 336 00:16:12,858 --> 00:16:14,160 >> GEHOOR: So wat GetInt funksie werk. 337 00:16:14,160 --> 00:16:16,243 >> DAVID J. MALAN: Sodat die GetInt funksie werk. 338 00:16:16,243 --> 00:16:18,115 Omdat die binnekant van hierdie lêer, CS50.h, wat 339 00:16:18,115 --> 00:16:20,950 ons sal sien voor lank in terme van die bron-kode, 340 00:16:20,950 --> 00:16:23,270 het 'n klomp van die funksies declared-- GetInt, GetString, 341 00:16:23,270 --> 00:16:26,950 en 'n klomp van die others-- en tensy ons eintlik wat insluit lyn, 342 00:16:26,950 --> 00:16:29,320 samesteller klang is nie gaan om te weet dat dit bestaan. 343 00:16:29,320 --> 00:16:32,400 En dieselfde geld vir lyn twee, waar int gedefinieer 344 00:16:32,400 --> 00:16:35,101 printf, wat is 'n funksie ons hou die gebruik nogal 'n bietjie. 345 00:16:35,101 --> 00:16:37,850 Nou, lyn vier lyk 'n bietjie funky want dit is net 'n een sak. 346 00:16:37,850 --> 00:16:41,570 Dit het 'n kommapunt, geen krullerige draadjies, geen kode binnekant van dit. 347 00:16:41,570 --> 00:16:44,640 Maar wat het ons 'n beroep hierdie ding in weke verlede? 348 00:16:44,640 --> 00:16:45,140 Ja. 349 00:16:45,140 --> 00:16:46,060 So 'n prototipe. 350 00:16:46,060 --> 00:16:48,390 En hoekom het ons 'n prototipe wat blyk 351 00:16:48,390 --> 00:16:51,050 om 'n bietjie oorbodig wees gewoonlik omdat ons gewoonlik 352 00:16:51,050 --> 00:16:53,474 sien die funksie weer later in die lêer, reg? 353 00:16:53,474 --> 00:16:56,390 So hoekom doen ons have-- jy net krap jou kop, maar ek sal dit vat. 354 00:16:56,390 --> 00:16:57,302 Ja. 355 00:16:57,302 --> 00:17:00,000 >> GEHOOR: [onhoorbaar] funksie na die hoof. 356 00:17:00,000 --> 00:17:01,000 DAVID J. MALAN: Presies. 357 00:17:01,000 --> 00:17:04,089 Sodat die samesteller weet jy sal uiteindelik definieer of te implementeer 358 00:17:04,089 --> 00:17:06,579 daardie funksie na hoof, vermoedelik. 359 00:17:06,579 --> 00:17:08,462 So klang en mees samestellers is soort van stom 360 00:17:08,462 --> 00:17:10,510 en hulle sal net weet wat jy hulle vertel. 361 00:17:10,510 --> 00:17:12,569 En as jy wil gebruik 'n funksie genoem sigma, 362 00:17:12,569 --> 00:17:15,710 jy beter leer samesteller dat dit bestaan ​​in advance. 363 00:17:15,710 --> 00:17:17,970 >> Nou, hoof self, selfs al is dit 'n klomp van lyne, 364 00:17:17,970 --> 00:17:19,839 is redelik vertroud hopelik deur die nou. 365 00:17:19,839 --> 00:17:21,942 Dit het 'n do while lus wie se doel in die lewe 366 00:17:21,942 --> 00:17:24,400 hier blykbaar is om 'n te kry positiewe heelgetal van die gebruiker. 367 00:17:24,400 --> 00:17:27,349 En net hou hom neul of haar totdat hulle saam te werk. 368 00:17:27,349 --> 00:17:30,670 Toe ek in lyn 16 Ek het 'n interessante gesprek. 369 00:17:30,670 --> 00:17:31,570 IntAnswer. 370 00:17:31,570 --> 00:17:33,710 Wat aan die linkerkant kant gee my 'n Int 371 00:17:33,710 --> 00:17:36,650 wat kan store-- genoem Answer-- wat gaan om te slaan, glo, 372 00:17:36,650 --> 00:17:39,090 die terugkeer waarde van sigma. 373 00:17:39,090 --> 00:17:41,840 So sigma is net 'n arbitrêre maar betekenisvolle naam 374 00:17:41,840 --> 00:17:44,500 wat ek aan 'n funksie wie se doel in die lewe 375 00:17:44,500 --> 00:17:47,680 is een argument-- neem ons sal dit N bel in hierdie case-- 376 00:17:47,680 --> 00:17:52,280 en net die som van dat die getal neem plus elke positiewe getal wat 377 00:17:52,280 --> 00:17:53,200 kleiner as wat dit. 378 00:17:53,200 --> 00:17:58,140 >> So as ek slaag in die nommer 2 te sigma, ek wil byvoeg 2 plus 1 379 00:17:58,140 --> 00:18:00,240 plus 0-- nie 0-- sodat gee my 3. 380 00:18:00,240 --> 00:18:05,320 As ek slaag in 3 tot sigma, ek wil het 3 plus 2 plus 1, wat gee my 6. 381 00:18:05,320 --> 00:18:05,900 En so meer. 382 00:18:05,900 --> 00:18:09,750 So dit voeg net al die getalle minder as of gelyk aan dit. 383 00:18:09,750 --> 00:18:12,040 >> Nou, hier af Ek gaan net om die druk van die antwoord. 384 00:18:12,040 --> 00:18:17,330 So as 'n vinnige gesonde verstand tjek, laat maak sigma 0-- dot streep sigma 0-- 385 00:18:17,330 --> 00:18:18,690 en laat my tik in 2. 386 00:18:18,690 --> 00:18:19,960 En Ek het wel kry 3. 387 00:18:19,960 --> 00:18:21,240 Laat my tik in 3. 388 00:18:21,240 --> 00:18:22,860 Ek het wel kry 6. 389 00:18:22,860 --> 00:18:27,636 En as iemand die wiskunde vinnig kan doen nie, as ek dit doen 50 wat gaan ek kry? 390 00:18:27,636 --> 00:18:29,839 >> GEHOOR: [onhoorbaar]. 391 00:18:29,839 --> 00:18:30,880 DAVID J. MALAN: Wel, nee. 392 00:18:30,880 --> 00:18:33,340 Maar 1275 wat is redelik naby. 393 00:18:33,340 --> 00:18:38,850 So, dit is die gevolg van doen 50 plus 49 plus 48 plus 47 plus 46 394 00:18:38,850 --> 00:18:40,349 al die pad af na 1. 395 00:18:40,349 --> 00:18:41,390 So dit is al sigma doen. 396 00:18:41,390 --> 00:18:43,350 Maar laat ons sien hoe ons het geïmplementeer nou. 397 00:18:43,350 --> 00:18:45,790 So af hier is die funksie self. 398 00:18:45,790 --> 00:18:49,000 En dit lyk nie te hê iets te doen met nog rekursie. 399 00:18:49,000 --> 00:18:51,070 In werklikheid, is ons met behulp van 'n ou skool tegniek. 400 00:18:51,070 --> 00:18:56,680 Ek is 'n bedrag initializing veranderlike genoem nul, dan het ek 'n foreloop hier 401 00:18:56,680 --> 00:19:00,790 en ek verklaar 'n Int genoem Ek, die opstel van dit gelyk aan 1-- 402 00:19:00,790 --> 00:19:04,080 al het ek dit gelyk aan kon stel nul, maar aangesien ek doen Daarbenewens 403 00:19:04,080 --> 00:19:05,340 Wie gee om as dit is zero of een. 404 00:19:05,340 --> 00:19:06,660 Dit gaan geen effek. 405 00:19:06,660 --> 00:19:10,110 >> So ek so lank as wat ek is iterating minder as of gelyk aan m, wat 406 00:19:10,110 --> 00:19:11,671 is die argument dat geslaag in. 407 00:19:11,671 --> 00:19:13,670 En dan het ek hou net die verhoog en insig I. 408 00:19:13,670 --> 00:19:20,010 van die lus al wat ek doen is som doen plus gelyk I. En dit is doelbewuste. 409 00:19:20,010 --> 00:19:22,326 Ek wil nie te doen nie, in hierdie geval, soos 'n bedrag plus plus. 410 00:19:22,326 --> 00:19:24,790 Ek wil eintlik voeg die huidige waarde van I 411 00:19:24,790 --> 00:19:28,190 wat word steeds groter en groter en groter om die lopende kerfstok. 412 00:19:28,190 --> 00:19:30,210 >> En dan het ek som terugkeer. 413 00:19:30,210 --> 00:19:33,850 En so antwoord kry die waarde som. 414 00:19:33,850 --> 00:19:35,282 En dan druk ek dit uit. 415 00:19:35,282 --> 00:19:37,740 So is daar 'n geleentheid hier alhoewel, soort vereenvoudig 416 00:19:37,740 --> 00:19:41,260 hierdie kode konseptueel en die aard van die slag een is 417 00:19:41,260 --> 00:19:43,250 omgee in terme van die eenvoud selfs al is dit 418 00:19:43,250 --> 00:19:45,700 neem 'n rukkie om te sorteer van verstaan ​​waarom hierdie 419 00:19:45,700 --> 00:19:47,330 is sterk in hierdie klein voorbeelde. 420 00:19:47,330 --> 00:19:50,380 Hier is sigma one-- so die tweede weergawe van hierdie kode. 421 00:19:50,380 --> 00:19:55,290 Alles up top identies so wat dieselfde storie geld as voorheen. 422 00:19:55,290 --> 00:19:59,220 Maar nou laat ons kyk na die implementering van sigma wat 423 00:19:59,220 --> 00:20:05,040 Ek het af Uiteindelik net hierdie lines-- vier reëls van die kode, regtig, 424 00:20:05,040 --> 00:20:06,980 plus 'n paar krulhakies en wit ruimte. 425 00:20:06,980 --> 00:20:07,930 >> Maar wat doen ek? 426 00:20:07,930 --> 00:20:11,050 As m minder as of gelyk aan zero, ek moet soort van hanteer 427 00:20:11,050 --> 00:20:12,490 dat super eenvoudige geval. 428 00:20:12,490 --> 00:20:15,450 En as jy my hand nul of enigiets negatiewe wat net vreemd, 429 00:20:15,450 --> 00:20:17,909 Ek gaan net na willekeur maar konsekwent nul terugkeer. 430 00:20:17,909 --> 00:20:20,200 Ek wil nie hierdie ding kry in 'n paar weird oneindige 431 00:20:20,200 --> 00:20:21,810 lus gevolg van 'n negatiewe waarde. 432 00:20:21,810 --> 00:20:25,070 So ek net sê, as jy my gee nul of minder, ek terugkeer nul. 433 00:20:25,070 --> 00:20:28,220 >> Maar dit is goed, want dit is dat enkele bladsy van die telefoon boek 434 00:20:28,220 --> 00:20:28,790 wat oorbly. 435 00:20:28,790 --> 00:20:32,660 Ek byt af 'n baie spesifieke probleem en nie iets rekursief roep. 436 00:20:32,660 --> 00:20:36,580 Maar in lyn 31, wat ek blyk te wees doen? 437 00:20:36,580 --> 00:20:39,780 Die hakies is net om dinge, hopelik, 'n bietjie duideliker. 438 00:20:39,780 --> 00:20:42,110 Maar al wat ek doen is ek is terugkeer m-- ookal 439 00:20:42,110 --> 00:20:45,790 jy me-- plus die hand waarde van m-- jammer, 440 00:20:45,790 --> 00:20:49,052 plus die waarde van sigma van m minus 1. 441 00:20:49,052 --> 00:20:50,010 So, wat beteken dit? 442 00:20:50,010 --> 00:20:53,965 As jy vir my die nommer 3 as insette, die antwoord wat ek wil uiteindelik kry 443 00:20:53,965 --> 00:20:57,307 6 want 3 plus 2 plus 1 gee my 6. 444 00:20:57,307 --> 00:20:59,390 Maar hoe ek dink oor hoe hierdie kode loop? 445 00:20:59,390 --> 00:21:03,070 Die eerste keer wat ek noem sigma en ek slaag in die waarde 3, 446 00:21:03,070 --> 00:21:07,960 dit is soos om te sê op 'n stuk papier, hier is die waarde 3 447 00:21:07,960 --> 00:21:09,920 en ek het dit geslaag is as sigma. 448 00:21:09,920 --> 00:21:13,090 3 is natuurlik nie minder as 0, sodat die IF voorwaarde geld nie. 449 00:21:13,090 --> 00:21:14,020 Die anders nie. 450 00:21:14,020 --> 00:21:14,990 So, wat moet ek doen? 451 00:21:14,990 --> 00:21:19,902 Ek wil m terugkeer, wat 3, plus sigma van m minus 1. 452 00:21:19,902 --> 00:21:21,110 So laat my spoor van hierdie hou. 453 00:21:21,110 --> 00:21:22,710 Ek gaan hierdie plaas stuk papier neer. 454 00:21:22,710 --> 00:21:24,668 En watter waarde te wees duidelik, ek gaan om te slaag 455 00:21:24,668 --> 00:21:26,540 in sigma op hierdie punt in die verhaal? 456 00:21:26,540 --> 00:21:28,080 Watter getal? 457 00:21:28,080 --> 00:21:28,610 2, reg? 458 00:21:28,610 --> 00:21:29,670 3 minus 1 is 2. 459 00:21:29,670 --> 00:21:32,000 So ek moet net 'n bietjie stukkie papier hier. 460 00:21:32,000 --> 00:21:33,931 So nou sigma is om weer genoem. 461 00:21:33,931 --> 00:21:35,930 En ek het doelbewus gestel dit neer, want dit is 462 00:21:35,930 --> 00:21:38,070 soort van soos pousering dat die weergawe van die storie 463 00:21:38,070 --> 00:21:40,720 want nou is ek gefokus op sein van m minus 1. 464 00:21:40,720 --> 00:21:42,660 So m was 3, m minus 1 is 2. 465 00:21:42,660 --> 00:21:45,110 So hier is 2 wat ek geslaag het. 466 00:21:45,110 --> 00:21:48,510 2 is natuurlik nie minder nie as 0 sodat geval nie van toepassing nie. 467 00:21:48,510 --> 00:21:53,445 Anders kom Ek terug m, wat is hierdie ding, plus sigma van watter waarde? 468 00:21:53,445 --> 00:21:56,160 469 00:21:56,160 --> 00:21:59,650 So as sigma van 1-- omdat m is nou 2 so 2 minus 1 is 1. 470 00:21:59,650 --> 00:22:01,950 So nou het ek net die waarde 1. 471 00:22:01,950 --> 00:22:04,810 Ek is verby net die aantal 1 om die funksie sigma-- 472 00:22:04,810 --> 00:22:09,120 of myself here-- so 1 is natuurlik nie minder as nul, nog nie van toepassing. 473 00:22:09,120 --> 00:22:12,970 >> Anders terugkeer 1 plus sigma van wat? 474 00:22:12,970 --> 00:22:13,470 0. 475 00:22:13,470 --> 00:22:14,678 So laat my onthou net dat. 476 00:22:14,678 --> 00:22:15,920 Ek kom terug na wat later kry. 477 00:22:15,920 --> 00:22:18,060 Nou gaan ek voort en jota gaan die nommer 0, want dit is 478 00:22:18,060 --> 00:22:19,470 my argument of parameter. 479 00:22:19,470 --> 00:22:22,400 Ek is verby die getal 0 en uiteindelik hierdie proses 480 00:22:22,400 --> 00:22:25,760 van net herhaal myself advertensie nauseum nie ophou want wat 481 00:22:25,760 --> 00:22:28,820 ek onmiddellik doen wanneer ek sien dit 0? 482 00:22:28,820 --> 00:22:29,790 Ek nul terugkeer. 483 00:22:29,790 --> 00:22:31,790 So nou moet jy die storie rewind. 484 00:22:31,790 --> 00:22:34,430 >> As ek nou terug gaan in tyd, wat was die mees onlangse ding 485 00:22:34,430 --> 00:22:36,670 Ek het as jy letterlik was omwikkelen n video? 486 00:22:36,670 --> 00:22:41,630 Ek gaan haal die mees onlangse 1 en dit gee my 1 plus 0 is 1. 487 00:22:41,630 --> 00:22:44,100 As ek hou omwikkelen die storie, wat gaan om te gee my 488 00:22:44,100 --> 00:22:46,880 2 plus hierdie hardloop waarde, wat 1. 489 00:22:46,880 --> 00:22:47,789 So dit is 3. 490 00:22:47,789 --> 00:22:49,330 En dan gaan ek omwikkelen hou. 491 00:22:49,330 --> 00:22:54,220 Toe ek die eerste keer die nommer 3-- so 3 plus 3 gee my 6. 492 00:22:54,220 --> 00:22:57,272 >> En nou, as jy het teruggedraai die video tot hierdie punt, 493 00:22:57,272 --> 00:22:58,980 dit was die eerste vraag het ek gevra. 494 00:22:58,980 --> 00:23:01,450 Wanneer geslaag 3, wat is sigma van 3? 495 00:23:01,450 --> 00:23:04,204 Dit is inderdaad 6, die som van al hierdie stukkies papier. 496 00:23:04,204 --> 00:23:07,120 So as dit neem 'n rukkie om draai jou gedagtes rond, is dit goed. 497 00:23:07,120 --> 00:23:10,700 Maar is van mening dit was 'n little-- dit was baie doelbewuste dat ek gestapel 498 00:23:10,700 --> 00:23:12,990 hierdie getalle op die top van mekaar. 499 00:23:12,990 --> 00:23:17,440 Dit is soort van soos 'n memory-- 'n rekord in die tyd, 500 00:23:17,440 --> 00:23:19,940 soos 'n scrubber in 'n video, dat ek inderdaad kan rewind in. 501 00:23:19,940 --> 00:23:24,350 En ons gaan om terug te kom om dat metafoor in net 'n bietjie. 502 00:23:24,350 --> 00:23:28,240 >> Maar eers, dit blyk dat daar 'n baie geeks en snaakse mense, 503 00:23:28,240 --> 00:23:29,614 Ek dink, op Google. 504 00:23:29,614 --> 00:23:31,530 Sou iemand wat baie goed op Googlen gedagte 505 00:23:31,530 --> 00:23:34,270 kom vir 'n oomblik en help my soek vir iets? 506 00:23:34,270 --> 00:23:35,650 Baie, baie lae sleutel. 507 00:23:35,650 --> 00:23:37,870 Iemand wat nooit kom voor, miskien. 508 00:23:37,870 --> 00:23:38,370 OK. 509 00:23:38,370 --> 00:23:39,030 Ja? 510 00:23:39,030 --> 00:23:39,530 Kom op. 511 00:23:39,530 --> 00:23:41,410 Kom af. 512 00:23:41,410 --> 00:23:42,183 Wat is jou naam? 513 00:23:42,183 --> 00:23:42,870 >> SAM: Sam. 514 00:23:42,870 --> 00:23:44,290 >> DAVID J. MALAN: Sam, kom op sit. 515 00:23:44,290 --> 00:23:45,320 Dit is dieselfde nie. 516 00:23:45,320 --> 00:23:46,280 Bly te kenne. 517 00:23:46,280 --> 00:23:46,780 Hey. 518 00:23:46,780 --> 00:23:47,580 Kom oor. 519 00:23:47,580 --> 00:23:51,290 So al wat ek nodig het om te doen, as jy kan, Sam, hier is Google. 520 00:23:51,290 --> 00:23:53,240 Jy kan soek vir die term rekursie? 521 00:23:53,240 --> 00:23:55,770 522 00:23:55,770 --> 00:23:56,270 Buit nie. 523 00:23:56,270 --> 00:23:59,940 524 00:23:59,940 --> 00:24:00,970 >> En let's-- nou ja. 525 00:24:00,970 --> 00:24:03,380 OK Klik dit. 526 00:24:03,380 --> 00:24:04,315 Beter klik nie. 527 00:24:04,315 --> 00:24:07,020 528 00:24:07,020 --> 00:24:08,020 Ahh, kry dit. 529 00:24:08,020 --> 00:24:08,520 Geen? 530 00:24:08,520 --> 00:24:09,050 OK. 531 00:24:09,050 --> 00:24:10,430 So kom ons doen 'n paar ander. 532 00:24:10,430 --> 00:24:12,830 Nie soseer verwante akademies hier, maar het jy 533 00:24:12,830 --> 00:24:14,520 ooit gesoek Google vir anagram? 534 00:24:14,520 --> 00:24:15,280 >> SAM: No. 535 00:24:15,280 --> 00:24:15,520 >> DAVID J. MALAN: OK. 536 00:24:15,520 --> 00:24:17,186 Soek anagram plaas van rekursie. 537 00:24:17,186 --> 00:24:22,540 538 00:24:22,540 --> 00:24:23,790 Hoe gaan skeef. 539 00:24:23,790 --> 00:24:25,515 Jy al ooit gesoek skeef? 540 00:24:25,515 --> 00:24:29,260 541 00:24:29,260 --> 00:24:32,692 Nou, hierdie een is 'n bietjie moeilik om te sien, maar hopelik everything's-- OK. 542 00:24:32,692 --> 00:24:34,150 Dis net ek en jy hierdie geniet. 543 00:24:34,150 --> 00:24:34,690 OK. 544 00:24:34,690 --> 00:24:38,950 >> So uiteindelik, hierdie one's-- dit is 'n bietjie skeef. 545 00:24:38,950 --> 00:24:40,810 Nou 'n vat roll. 546 00:24:40,810 --> 00:24:44,460 547 00:24:44,460 --> 00:24:45,310 Wonderlik. 548 00:24:45,310 --> 00:24:45,910 Alles reg. 549 00:24:45,910 --> 00:24:47,110 Baie dankie aan Sam. 550 00:24:47,110 --> 00:24:49,416 Hier gaan jy. 551 00:24:49,416 --> 00:24:50,400 Dankie. 552 00:24:50,400 --> 00:24:52,807 >> So wat gaan aan in alle van hierdie dom voorbeelde? 553 00:24:52,807 --> 00:24:55,640 So regtig, onder die kap van Miljoene reëls van die kode Google se 554 00:24:55,640 --> 00:24:58,860 blykbaar is 'n paar dom AS voorwaardes wat in wese 555 00:24:58,860 --> 00:25:01,160 seker te maak dat die gebruiker getik in hierdie frase, 556 00:25:01,160 --> 00:25:03,760 iets wat waarskynlik het te doen 'n triviaal bedrag van die tyd 557 00:25:03,760 --> 00:25:06,080 te implementeer net wees amusant op hierdie manier. 558 00:25:06,080 --> 00:25:08,430 Maar dit is al wat dit kook af na onder die kap. 559 00:25:08,430 --> 00:25:11,570 Maar, natuurlik, rekursie meer van die geekier 560 00:25:11,570 --> 00:25:13,880 byvoorbeeld onder diegene spesiale truuks. 561 00:25:13,880 --> 00:25:16,880 En sekerlik daar is ander daar buite so goed dat ons dalk nie eens 562 00:25:16,880 --> 00:25:18,230 nog net ontdek. 563 00:25:18,230 --> 00:25:22,830 >> So 'n blik of te oorweeg nou die volgende program, 564 00:25:22,830 --> 00:25:24,830 en beslis enige gryp van hierdie op jou pad uit. 565 00:25:24,830 --> 00:25:28,820 Ek gaan om voort te gaan en maak 'n program wat 566 00:25:28,820 --> 00:25:30,920 gaan probeer om twee waardes te ruil. 567 00:25:30,920 --> 00:25:33,210 Maar voordat ons daar te gaan, laat ons dit doen. 568 00:25:33,210 --> 00:25:38,500 Kon ons kry 'n meer vrywilliger, dink ek? 569 00:25:38,500 --> 00:25:40,480 Wil jy om vrywillig? 570 00:25:40,480 --> 00:25:40,980 Geen? 571 00:25:40,980 --> 00:25:41,890 Kom up. 572 00:25:41,890 --> 00:25:42,390 Kom up. 573 00:25:42,390 --> 00:25:42,890 Alles reg. 574 00:25:42,890 --> 00:25:44,136 Sodat jou naam is wat? 575 00:25:44,136 --> 00:25:44,810 >> LAUREN: Lauren. 576 00:25:44,810 --> 00:25:45,768 >> DAVID J. MALAN: Lauren. 577 00:25:45,768 --> 00:25:46,890 Kom op, Lauren. 578 00:25:46,890 --> 00:25:50,140 So Lauren is om hier uitgedaag soos volg. 579 00:25:50,140 --> 00:25:52,310 Bly te kenne. 580 00:25:52,310 --> 00:25:55,730 So Lauren hier het in die voorkant haar twee leë koppies. 581 00:25:55,730 --> 00:25:57,570 En ons het 'n paar oranje sap en melk 582 00:25:57,570 --> 00:26:00,301 en ons gaan om te gaan voor en doen die volgende. 583 00:26:00,301 --> 00:26:01,550 Ons is net gaan om dit te vul. 584 00:26:01,550 --> 00:26:07,840 'N Paar onse melk oor hier en laat ons vul 'n bietjie lemoensap hier. 585 00:26:07,840 --> 00:26:11,475 >> En in die voorkant van al hierdie gehoor, 586 00:26:11,475 --> 00:26:13,550 ruil die twee waardes van hierdie koppies. 587 00:26:13,550 --> 00:26:16,970 Sit die lemoensap in die melk beker en die melk in die koppie lemoensap. 588 00:26:16,970 --> 00:26:22,380 589 00:26:22,380 --> 00:26:26,150 Hoe sou jy dit doen as jy by huis en het toegang tot ander voorrade? 590 00:26:26,150 --> 00:26:27,400 LAUREN: Sit dit in 'n ander koppie. 591 00:26:27,400 --> 00:26:28,191 DAVID J. MALAN: OK. 592 00:26:28,191 --> 00:26:31,940 So laat ons 'n tydelike veranderlike, as ons wil. 593 00:26:31,940 --> 00:26:35,871 En gaan nou voort en implementeer dieselfde uitruiling prosedure. 594 00:26:35,871 --> 00:26:36,370 So goed. 595 00:26:36,370 --> 00:26:41,490 Ons het PB sit in die tydelike veranderlike, melk in die PB veranderlike, 596 00:26:41,490 --> 00:26:44,481 En nou het die tydelike veranderlike in die melk veranderlike. 597 00:26:44,481 --> 00:26:44,980 OK. 598 00:26:44,980 --> 00:26:48,740 So baie goed tot dusver gedoen. 599 00:26:48,740 --> 00:26:50,990 So dit blyk dat out-- hou gedink vir net 'n oomblik. 600 00:26:50,990 --> 00:26:54,479 Hier net geek dit 'n bietjie, hierdie sou die ooreenstemmende C-kode wees 601 00:26:54,479 --> 00:26:55,520 dat ons net geïmplementeer word. 602 00:26:55,520 --> 00:26:58,650 Ons het twee insette, A en B, beide van wat ons nou net sal sê vir die eenvoud is 603 00:26:58,650 --> 00:26:59,260 int se. 604 00:26:59,260 --> 00:27:02,780 En let hier, as ek wil ruil die waardes van die twee veranderlikes, A en B, 605 00:27:02,780 --> 00:27:06,890 ons inderdaad 'n middelman nodig, 'n tydelike veranderlike, 'n tydelike beker, 606 00:27:06,890 --> 00:27:10,830 waarin die gooi een van die waardes sodat ons 'n plekhouer vir dit. 607 00:27:10,830 --> 00:27:13,480 Maar dan die kode is presies Lauren hier geïmplementeer. 608 00:27:13,480 --> 00:27:15,500 >> Nou, net om 'n te kry bietjie crazier, blyk 609 00:27:15,500 --> 00:27:20,930 dat jy dit kan doen sonder 'n tydelike veranderlike. 610 00:27:20,930 --> 00:27:24,870 Om dit behoorlik te doen, al is, ons gaan om te kul met 'n paar chemie. 611 00:27:24,870 --> 00:27:26,380 Ons het 'n paar ekstra koppies hier. 612 00:27:26,380 --> 00:27:29,600 So die naaste ding wat lyk soos melk en water perhaps-- 613 00:27:29,600 --> 00:27:34,090 of melk en OJ-- is ons 'n paar water, so ons sal hierdie een vul 614 00:27:34,090 --> 00:27:36,486 met 'n paar onse helder water. 615 00:27:36,486 --> 00:27:38,332 Dit is waarskynlik te veel. 616 00:27:38,332 --> 00:27:38,832 Ja. 617 00:27:38,832 --> 00:27:39,934 Dit is beslis te veel. 618 00:27:39,934 --> 00:27:40,600 Hou op een sek. 619 00:27:40,600 --> 00:27:43,520 620 00:27:43,520 --> 00:27:48,420 >> En nou het ons olie, wat, soos ek onthou vanaf middel skool chemie klas, 621 00:27:48,420 --> 00:27:49,990 Hopelik sal dit nie meng met water. 622 00:27:49,990 --> 00:27:53,650 Maar dit soort van soort lyk soos melk en PB. 623 00:27:53,650 --> 00:27:55,760 So nou, sonder die gebruik van 'n tydelike veranderlike, 624 00:27:55,760 --> 00:27:59,260 kan jy daardie twee waardes te ruil? 625 00:27:59,260 --> 00:28:03,884 So olies gaan in die water beker, water gaan in die olie koppie. 626 00:28:03,884 --> 00:28:04,800 LAUREN: Geen ander koppies? 627 00:28:04,800 --> 00:28:05,940 DAVID J. MALAN: Geen ander koppies. 628 00:28:05,940 --> 00:28:07,860 En ek het nie eintlik hierdie getoets voordat vanjaar 629 00:28:07,860 --> 00:28:10,110 so ek weet nie of dit sal eintlik werk chemies. 630 00:28:10,110 --> 00:28:16,130 631 00:28:16,130 --> 00:28:18,650 Dit is nie veronderstel om te gebeur. 632 00:28:18,650 --> 00:28:19,761 Is dit werk? 633 00:28:19,761 --> 00:28:20,260 Alles reg. 634 00:28:20,260 --> 00:28:20,990 So skei? 635 00:28:20,990 --> 00:28:21,490 Goed. 636 00:28:21,490 --> 00:28:24,714 Nou het ons die kry water in die ander beker. 637 00:28:24,714 --> 00:28:27,630 Slimmer chemie konsentreerders kon waarskynlik doen beter as ek. 638 00:28:27,630 --> 00:28:28,510 >> LAUREN: Die water is op die bodem. 639 00:28:28,510 --> 00:28:31,910 >> DAVID J. MALAN: Die water-- dit was wat is die sleutel van die laaste keer dat ons dit gedoen het. 640 00:28:31,910 --> 00:28:33,950 Jy het om dit te doen in die regte volgorde. 641 00:28:33,950 --> 00:28:34,450 Ja. 642 00:28:34,450 --> 00:28:35,270 That's-- OK. 643 00:28:35,270 --> 00:28:37,290 So nou het ons twee koppies olie. 644 00:28:37,290 --> 00:28:37,790 OK. 645 00:28:37,790 --> 00:28:38,510 Dit is OK. 646 00:28:38,510 --> 00:28:40,110 Maar as dit chemies gewerk as I-- 647 00:28:40,110 --> 00:28:41,200 >> LAUREN: Dit is water. 648 00:28:41,200 --> 00:28:41,930 >> DAVID J. MALAN: Dit is meestal water. 649 00:28:41,930 --> 00:28:42,430 Alles reg. 650 00:28:42,430 --> 00:28:44,210 Maar dit is nog steeds dieselfde beker as tevore. 651 00:28:44,210 --> 00:28:47,570 So gooi it-- probeer om dit daar. 652 00:28:47,570 --> 00:28:49,300 OK. 653 00:28:49,300 --> 00:28:51,010 Dit is 'n goeie gebruik van klastyd vandag. 654 00:28:51,010 --> 00:28:51,510 OK. 655 00:28:51,510 --> 00:28:53,890 So nou we-- nice. 656 00:28:53,890 --> 00:28:55,460 Soortvan. 657 00:28:55,460 --> 00:28:55,960 Alles reg. 658 00:28:55,960 --> 00:28:56,690 So baie goed. 659 00:28:56,690 --> 00:29:00,006 Dankie aan Lauren. 660 00:29:00,006 --> 00:29:01,950 Baie goed gedoen. 661 00:29:01,950 --> 00:29:04,570 >> So net jou gedagtes blaas, en dit is dalk iets 662 00:29:04,570 --> 00:29:08,660 om te speel met as jy wil in CS50 ID, jy kan, in werklikheid, ruil twee veranderlikes 663 00:29:08,660 --> 00:29:11,470 sonder die gebruik van 'n tydelike heelgetal. 664 00:29:11,470 --> 00:29:13,060 En dit is die ooreenstemmende C-kode. 665 00:29:13,060 --> 00:29:16,110 En as jy onthou van verlede Woensdag, het ons ', as kortliks, 666 00:29:16,110 --> 00:29:19,720 'n paar nuwe operateurs in C. En doen iemand onthou wat die klein wortel 667 00:29:19,720 --> 00:29:23,660 simbool is, wat min driehoekige simbool van die sleutelbord verteenwoordig? 668 00:29:23,660 --> 00:29:26,003 Wat bis operateur? 669 00:29:26,003 --> 00:29:26,770 >> GEHOOR: EXOR. 670 00:29:26,770 --> 00:29:27,645 >> DAVID J. MALAN: EXOR. 671 00:29:27,645 --> 00:29:28,560 Exclusive Or. 672 00:29:28,560 --> 00:29:32,920 So as jy wil, net vir die pret op huis, om 'n en b twee arbitrêre gee 673 00:29:32,920 --> 00:29:36,072 waardes soos enige eight-- en ek sou 'n agt bietjie waarde te kies. 674 00:29:36,072 --> 00:29:38,530 As jy dit doen met 32 ​​stukkies, jy sal baie vinnig verveeld. 675 00:29:38,530 --> 00:29:42,150 Maar net gee 'n bietjie van 'n agt waarde wat ook al, een of twee, 676 00:29:42,150 --> 00:29:43,790 en gee b 'n soortgelyke waarde. 677 00:29:43,790 --> 00:29:46,810 En dan met behulp van die definisie van XOR van verlede Woensdag, 678 00:29:46,810 --> 00:29:52,560 toepas bietjie vir bietjie, elk van diegene agt bisse in elk van a en b, 679 00:29:52,560 --> 00:29:54,980 en dan doen dit presies per hierdie kode. 680 00:29:54,980 --> 00:29:58,170 En dit is nie korrek wat jy sien hier op die skerm. 681 00:29:58,170 --> 00:30:02,100 Dit kom wel af drie XOR bedrywighede 682 00:30:02,100 --> 00:30:05,910 en een of ander manier mettertyd 'n en b sal posisies te ruil 683 00:30:05,910 --> 00:30:08,010 sonder dat enige inligting. 684 00:30:08,010 --> 00:30:11,580 >> So het die olie en water truuk is die naaste werklike wêreld inkarnasie 685 00:30:11,580 --> 00:30:12,980 Ek kon dink om na te boots nie. 686 00:30:12,980 --> 00:30:15,950 Maar dit is sekerlik makliker om gebruik 'n tydelike veranderlike, 687 00:30:15,950 --> 00:30:16,920 soos in hierdie geval hier. 688 00:30:16,920 --> 00:30:21,190 En dit is ook 'n geleentheid sê Ook hierdie soort van mikro optimalisering, 689 00:30:21,190 --> 00:30:23,590 as 'n rekenaar wetenskaplike sou sê, terwyl soort pret 690 00:30:23,590 --> 00:30:27,060 om te spog oor hoe jy dit gedoen het sonder soos uitruiling met 'n ekstra veranderlike, 691 00:30:27,060 --> 00:30:28,640 dit is nie al wat dwingende. 692 00:30:28,640 --> 00:30:31,619 Want om 32 stukkies, soos red in die geval van 'n werklike int, 693 00:30:31,619 --> 00:30:33,410 is nie al wat dwingende op 'n stelsel waar 694 00:30:33,410 --> 00:30:36,722 jy kan met behulp van tien megagrepe of selfs meer so geheue hierdie dae. 695 00:30:36,722 --> 00:30:38,680 En in die feit, wanneer ons tot 'n later probleem stel 696 00:30:38,680 --> 00:30:41,010 en jy spel implementeer checker en jy sal 697 00:30:41,010 --> 00:30:43,550 uitgedaag word om so te doen met hierdie so min geheue en so min 698 00:30:43,550 --> 00:30:46,820 tyd as moontlik op die computer-- jy nog 699 00:30:46,820 --> 00:30:50,160 'n week om te implementeer it-- jy have-- jy sal 700 00:30:50,160 --> 00:30:51,799 uitgedaag om daardie hulpbronne te verminder. 701 00:30:51,799 --> 00:30:53,840 En dit is werklik die enigste occasion hierdie semester 702 00:30:53,840 --> 00:30:57,940 waar jy aangemoedig word om te skeer af selfs die beste prestasie 703 00:30:57,940 --> 00:30:59,340 kos anders. 704 00:30:59,340 --> 00:31:02,200 >> So hoe kan ons what-- sien dit in die werklike kode? 705 00:31:02,200 --> 00:31:04,530 Laat my nou gaan voort en maak 'n voorbeeld 706 00:31:04,530 --> 00:31:07,700 wat doelbewus genoem Geen Swap omdat dit nie 707 00:31:07,700 --> 00:31:10,670 in die feit dat die veranderlikes te ruil as jy eintlik kan verwag. 708 00:31:10,670 --> 00:31:12,260 So laat ons neem 'n blik. 709 00:31:12,260 --> 00:31:17,050 Hier is 'n program wat nie CS50 het biblioteek gaan, net standaard I / O. 710 00:31:17,050 --> 00:31:19,560 Nou het ons 'n prototipe vir swap up top wat net 711 00:31:19,560 --> 00:31:21,540 beteken dit het later gedefinieer. 712 00:31:21,540 --> 00:31:22,550 En hier is die hoof. 713 00:31:22,550 --> 00:31:26,000 >> Ek arbitrêr opgedra x en y, onderskeidelik, die waardes een en twee 714 00:31:26,000 --> 00:31:28,590 net omdat hulle is klein en maklik om te dink oor. 715 00:31:28,590 --> 00:31:32,280 En dan het ek net 'n klomp van die printfs waar ek 'n gesonde verstand tjek. x is 1 716 00:31:32,280 --> 00:31:35,110 en y is 2 is vermoedelik wat daardie printfs sal sê. 717 00:31:35,110 --> 00:31:36,530 Sodat daar geen magic dusver. 718 00:31:36,530 --> 00:31:40,100 >> Dan gaan ek om te eis met druk def, uitruiling dot dot dot. 719 00:31:40,100 --> 00:31:43,730 Ek gaan die swap noem funksie, verby in x en y. 720 00:31:43,730 --> 00:31:47,350 En laat ons veronderstel vir nou dat swap presies geïmplementeer 721 00:31:47,350 --> 00:31:49,930 soos dit was 'n oomblik gelede met 'n tydelike veranderlike. 722 00:31:49,930 --> 00:31:52,670 En so het ek beweer vrymoedigheid, verruil. 723 00:31:52,670 --> 00:31:55,429 x is nou hierdie en y is nou dat. 724 00:31:55,429 --> 00:31:57,220 Maar die lêer, natuurlik, genoem Geen Swap. 725 00:31:57,220 --> 00:31:58,678 So laat eintlik sien wat gebeur. 726 00:31:58,678 --> 00:32:04,450 As ek nie ruil en dan stel doen ./noswap, x is 1, y is 2. 727 00:32:04,450 --> 00:32:05,770 Uitruiling verruil. 728 00:32:05,770 --> 00:32:07,200 x is 1, y is 2. 729 00:32:07,200 --> 00:32:11,980 So dit lyk eintlik selfs gebrekkig al swap-- laat rol af now-- 730 00:32:11,980 --> 00:32:16,542 presies geïmplementeer per die Ek code 'n oomblik gelede voorgestel. 731 00:32:16,542 --> 00:32:19,000 So ons is nie van plan om fancy kry met die XOR dinge vir nou. 732 00:32:19,000 --> 00:32:21,890 Dit is ook, moet net werk soos met die melk en PB, 733 00:32:21,890 --> 00:32:25,820 maar dit lyk nie te werk. 734 00:32:25,820 --> 00:32:27,180 >> So laat dit weer te doen. 735 00:32:27,180 --> 00:32:29,310 Miskien het ek net nie hardloop dit reg. 736 00:32:29,310 --> 00:32:32,010 So laat weer loop Geen Swap. 737 00:32:32,010 --> 00:32:32,900 Miskien I-- no. 738 00:32:32,900 --> 00:32:34,400 So dit is net nie werk nie. 739 00:32:34,400 --> 00:32:36,060 So kom ons doen 'n bietjie gesonde verstand tjek. 740 00:32:36,060 --> 00:32:39,690 Laat my hier gaan voort in Swap en voeg net, wag 'n minuut, 741 00:32:39,690 --> 00:32:43,856 n is% i / n en laat plug-in die waarde van a. 742 00:32:43,856 --> 00:32:45,730 Want ek wil regtig om te sien wat aangaan. 743 00:32:45,730 --> 00:32:47,570 En inderdaad, dit is 'n debugging tegniek 744 00:32:47,570 --> 00:32:50,028 wat jy kan gebruik in kantoorure of by al die huis, 745 00:32:50,028 --> 00:32:53,560 soortgelyk aan die eerste helfte van Dan Video Armendariz in PSET3 746 00:32:53,560 --> 00:32:56,870 waarin ons druk bekendgestel def as 'n aanbevole tegniek, ten minste 747 00:32:56,870 --> 00:32:58,080 vir eenvoudige gevalle. 748 00:32:58,080 --> 00:33:01,720 Laat my gaan voort en loop maak nie weer omruil, ./noswap. 749 00:33:01,720 --> 00:33:04,370 750 00:33:04,370 --> 00:33:05,840 >> Interessant. 751 00:33:05,840 --> 00:33:11,670 So sien wat lyk om waar te wees. x is 1, y is 2, maar 'n 2 indien b 1. 752 00:33:11,670 --> 00:33:16,790 So die twee een of ander manier het omgeruil maar x en y kry nie omgeruil. 753 00:33:16,790 --> 00:33:21,090 So duidelik wees, wat gebeur is, hier het ek x en y 754 00:33:21,090 --> 00:33:25,380 en dié veranderlikes in die plaaslike omvang van die belangrikste, ek verby in x en y 755 00:33:25,380 --> 00:33:26,170 om te ruil. 756 00:33:26,170 --> 00:33:29,080 Nou, ruil, as 'n afsonderlike funksie, is vry om sy argumente noem 757 00:33:29,080 --> 00:33:30,590 of sy parameters enigiets wat dit wil hê. 758 00:33:30,590 --> 00:33:33,280 Cat of kroeg of x of y of a of b. 759 00:33:33,280 --> 00:33:36,870 Net om duidelik te maak dat hulle nie identies aan x en y per se, 760 00:33:36,870 --> 00:33:38,020 Ek het gesê 'n en b. 761 00:33:38,020 --> 00:33:40,040 Maar ons kon hulle niks wat ons wil noem. 762 00:33:40,040 --> 00:33:43,960 >> En so lyk dit soos swap word geslaag 763 00:33:43,960 --> 00:33:48,980 x-- AKA a-- en dit is oorgedra y-- AKA b. 764 00:33:48,980 --> 00:33:51,900 Een of ander manier hierdie drie lyne uitruiling presies daardie waardes 765 00:33:51,900 --> 00:33:53,510 Lauren het met die melk en PB. 766 00:33:53,510 --> 00:33:56,010 Maar wanneer ons uit te druk die waardes, A en B 767 00:33:56,010 --> 00:34:01,340 is inderdaad ruil, maar x en y het geen verandering aan hulle. 768 00:34:01,340 --> 00:34:03,150 Onthou dat x en y hier. 769 00:34:03,150 --> 00:34:05,320 >> So kan ons sien via Nog 'n tegniek as well. 770 00:34:05,320 --> 00:34:08,110 En dit is ook 'n tegniek ingebed in die probleem stel drie. 771 00:34:08,110 --> 00:34:10,780 Kom ons gaan voort en doen dit in CS50 ID as jy nie reeds. 772 00:34:10,780 --> 00:34:13,730 Op die regterkant ons hierdie blad Debugger. 773 00:34:13,730 --> 00:34:16,159 En as jy dit oopmaak, daar is 'n paar arcane inligting 774 00:34:16,159 --> 00:34:17,530 dit is gegooi by jou aanvanklik. 775 00:34:17,530 --> 00:34:19,310 Maar laat ons terg hierdie uitmekaar ware vinnig. 776 00:34:19,310 --> 00:34:21,620 >> So een, jy sien plaaslike veranderlikes. 777 00:34:21,620 --> 00:34:26,230 Blyk dat bou in CS50 IDE, en 'n baie van die ontwikkeling omgewings meer 778 00:34:26,230 --> 00:34:28,060 algemeen, is 'n debugger. 779 00:34:28,060 --> 00:34:31,340 'N instrument wat jou toelaat om te sien visueel wat gaan aan die binnekant van jou program 780 00:34:31,340 --> 00:34:34,380 sonder om plek te te voeg printfs en die opstel en bestuur van 781 00:34:34,380 --> 00:34:37,588 en die toevoeging van printf en die opstel en hardloop, wat reeds in kantoorure 782 00:34:37,588 --> 00:34:40,070 of 'n huis, is waarskynlik kry mooi saai. 783 00:34:40,070 --> 00:34:43,090 >> So hier, in 'n oomblik, ons is gaan om te sien in real time 784 00:34:43,090 --> 00:34:44,760 die waardes van ons plaaslike veranderlikes. 785 00:34:44,760 --> 00:34:47,880 Ons gaan ook in staat wees om op te rig wat is inspeksiepunte genoem wat 786 00:34:47,880 --> 00:34:52,570 geleenthede in my program te breek uitvoering op 'n spesifieke reël van die kode 787 00:34:52,570 --> 00:34:53,710 dat ek nuuskierig oor. 788 00:34:53,710 --> 00:34:54,210 Reg? 789 00:34:54,210 --> 00:34:55,969 Hierdie programme hardloop in 'n split sekonde. 790 00:34:55,969 --> 00:35:00,450 Dit is soort van mooi vir ons stadiger mense in staat wees om te breek, neem 'n oomblik, sien 791 00:35:00,450 --> 00:35:02,380 wat gaan aan om 'n sekere lyn van die kode 792 00:35:02,380 --> 00:35:05,050 sonder die program geploeg deur dit en heeltemal afwerking. 793 00:35:05,050 --> 00:35:08,510 So 'n inbreekpunt gaan ons toelaat om breek en breek op 'n sekere punt. 794 00:35:08,510 --> 00:35:12,990 >> Call stack is 'n fancy manier sê wat funksies is tans 795 00:35:12,990 --> 00:35:14,140 genoem op die oomblik. 796 00:35:14,140 --> 00:35:15,370 Main word altyd eerste genoem. 797 00:35:15,370 --> 00:35:17,230 Maar as Main noem 'n funksie genoem Swap, 798 00:35:17,230 --> 00:35:20,470 ons eintlik gaan om dit te sien toring van funksies wat gewees 799 00:35:20,470 --> 00:35:22,400 genoem in omgekeerde chronologiese volgorde. 800 00:35:22,400 --> 00:35:23,310 So laat sien. 801 00:35:23,310 --> 00:35:24,327 >> Ek gaan om te vergroot. 802 00:35:24,327 --> 00:35:25,660 Ek gaan om terug te gaan na my kode. 803 00:35:25,660 --> 00:35:27,540 En net omdat ek wil hier pedanties wees, 804 00:35:27,540 --> 00:35:31,100 Ek gaan om voort te gaan en klik net aan die linkerkant van die lyn vyf. 805 00:35:31,100 --> 00:35:32,830 En dit skep 'n rooi dot. 806 00:35:32,830 --> 00:35:36,200 En let op die regterkant dat die debugger weet, hey, 807 00:35:36,200 --> 00:35:41,020 Ek het net gesê 'n breekpunt op noswap.c line vyf spesifiek 808 00:35:41,020 --> 00:35:42,480 op hierdie lyn van die kode. 809 00:35:42,480 --> 00:35:45,090 So die debugger weet dat ek het versoek dat die volgende keer 810 00:35:45,090 --> 00:35:48,530 Ek hardloop my program dit breek uitvoering daar eerder as om net 811 00:35:48,530 --> 00:35:50,390 die bestuur van die hele ding super vinnig. 812 00:35:50,390 --> 00:35:53,889 >> So nou gaan ek op die Debug knoppie op die top van die IDE 813 00:35:53,889 --> 00:35:55,430 en wat gaan die volgende te doen. 814 00:35:55,430 --> 00:36:00,680 Dit gaan 'n oop aanvanklik ietwat scary soek tweede terminale window-- 815 00:36:00,680 --> 00:36:02,679 remote debugging van gasheer so en such-- 816 00:36:02,679 --> 00:36:04,970 en ons sal terug te kom wat al beteken dit dat voor lank. 817 00:36:04,970 --> 00:36:09,020 Maar wat belangrik is vir nou is dat die rooi dot getref, 818 00:36:09,020 --> 00:36:11,735 die debugger het doelbewus gestop execution-- 819 00:36:11,735 --> 00:36:15,560 nie op daardie lyn per se, maar op die eerste lyn van werklike kode in daardie funksie. 820 00:36:15,560 --> 00:36:18,040 En dit is hoekom lyn sewe is nou geel gemerk. 821 00:36:18,040 --> 00:36:20,550 >> En nou, laat ons 'n blik op die regte kant. 822 00:36:20,550 --> 00:36:27,300 Dit lyk, by verstek, mooi genoeg nie, x het watter waarde? 823 00:36:27,300 --> 00:36:27,860 0. 824 00:36:27,860 --> 00:36:29,750 En y het watter waarde? 825 00:36:29,750 --> 00:36:30,410 Zero. 826 00:36:30,410 --> 00:36:35,540 En dit is wat verwag kan word in die sin dat x en y-- geel line-- het 827 00:36:35,540 --> 00:36:36,770 nog nie uitgevoer word. 828 00:36:36,770 --> 00:36:38,510 So x moet nie die waarde 1. 829 00:36:38,510 --> 00:36:41,470 Dit mag dalk 'n ander waarde, 'n sogenaamde vullis waarde. 830 00:36:41,470 --> 00:36:44,320 En ons het gelukkig in die sin dat dit nul op hierdie punt, wese. 831 00:36:44,320 --> 00:36:46,400 >> So nou is daar net 'n paar knoppies ons nodig om te sorg 832 00:36:46,400 --> 00:36:48,100 oor wanneer debugging op hierdie manier. 833 00:36:48,100 --> 00:36:49,970 Let hier, ons het 'n Play knoppie. 834 00:36:49,970 --> 00:36:51,877 En as ons speel of druk hervat, dit is net 835 00:36:51,877 --> 00:36:53,710 gaan om te loop deur die res van die program 836 00:36:53,710 --> 00:36:55,300 of totdat dit treffers ander breekpunt. 837 00:36:55,300 --> 00:36:56,910 Maar ek het nie enige ander stel inspeksiepunte so dit is net 838 00:36:56,910 --> 00:36:58,118 gaan om te loop deur die einde. 839 00:36:58,118 --> 00:37:00,280 Dat die soort van nederlae die doel van skeer rond. 840 00:37:00,280 --> 00:37:03,290 >> So in plaas, ek omgee hierdie ikone na regs. 841 00:37:03,290 --> 00:37:05,360 En as ek Beweeg oor hulle, soos jy moet ook 842 00:37:05,360 --> 00:37:07,450 jy sal sien bietjie tips-- instrument wenke. 843 00:37:07,450 --> 00:37:09,020 Hierdie een is stap oor. 844 00:37:09,020 --> 00:37:11,290 Nou dit beteken nie skip die volgende lyn van die kode. 845 00:37:11,290 --> 00:37:14,840 Dit beteken net dit uit te voer en skuif na die volgende, skuif na die volgende, 846 00:37:14,840 --> 00:37:15,580 skuif na die volgende. 847 00:37:15,580 --> 00:37:17,610 Met ander woorde, via dat die knoppie, kan ek loop 848 00:37:17,610 --> 00:37:20,390 deur my kode een stap op 'n tyd. 849 00:37:20,390 --> 00:37:21,914 Reël vir reël, letterlik. 850 00:37:21,914 --> 00:37:23,830 Nou, aan die regterkant van dat daar 'n ander een 851 00:37:23,830 --> 00:37:25,163 dat ons sal sien in net 'n oomblik. 852 00:37:25,163 --> 00:37:27,820 Dit is die sogenaamde Stap in ikoon wat 853 00:37:27,820 --> 00:37:30,300 gaan my toelaat duik in 'n ander funksie. 854 00:37:30,300 --> 00:37:31,800 Maar laat ons sien dit in net 'n oomblik. 855 00:37:31,800 --> 00:37:33,280 So ek gaan klik stap oor. 856 00:37:33,280 --> 00:37:35,820 En nou sien, as ek op hierdie knoppie regs bo, 857 00:37:35,820 --> 00:37:41,260 hou jou oë rofweg onder Plaaslike Veranderlikes en kyk wat gebeur met x. 858 00:37:41,260 --> 00:37:44,115 x is nou 1, want die geel lyn is nou uitgevoer 859 00:37:44,115 --> 00:37:45,840 en ons het verhuis na reël 8. 860 00:37:45,840 --> 00:37:49,840 En in net 'n oomblik y moet hopelik geword 2. 861 00:37:49,840 --> 00:37:52,330 >> Nou, niks wat interessante gebeur vir 'n bietjie. 862 00:37:52,330 --> 00:37:53,390 Dit alles is is printf. 863 00:37:53,390 --> 00:37:58,010 En sien, in my sekondêre terminale venster, sien ek die uitset van die gedrukte def. 864 00:37:58,010 --> 00:38:01,080 En nou het ek 'n maak besluit as die programmeerder. 865 00:38:01,080 --> 00:38:04,360 Ek kan stap oor die lyn van kode, die uitvoering van dit, maar nie 866 00:38:04,360 --> 00:38:06,220 kry nuuskierig oor wat die binnekant. 867 00:38:06,220 --> 00:38:11,130 Of ek kan eintlik stap in dit en gaan binne Swap self. 868 00:38:11,130 --> 00:38:12,340 So kom ons doen die laasgenoemde. 869 00:38:12,340 --> 00:38:15,550 >> Laat my gaan voort en klik nie oorstap maar stap in. 870 00:38:15,550 --> 00:38:17,300 Kennisgewing, al van 'n skielike die venster veranderinge 871 00:38:17,300 --> 00:38:19,330 om die eerste hoogtepunt reël van die kode in te ruil. 872 00:38:19,330 --> 00:38:20,710 Dit is lyn 21. 873 00:38:20,710 --> 00:38:25,220 En nou, wat is soort van funky is dat, As jy kyk hier oor, soos verwag, 874 00:38:25,220 --> 00:38:29,720 'n komma b is 1 en 2, onderskeidelik. 875 00:38:29,720 --> 00:38:33,840 Hoekom is temp 32767? 876 00:38:33,840 --> 00:38:36,560 Daaraan te herinner dat temp, baie soos die leë koppie 'n oomblik gelede 877 00:38:36,560 --> 00:38:38,980 word hier verklaar op die lyn 21. 878 00:38:38,980 --> 00:38:43,390 Hoekom 32,000- Ek bedoel, hoekom is dit is net 'n paar weird waarde? 879 00:38:43,390 --> 00:38:43,890 Ja? 880 00:38:43,890 --> 00:38:45,190 >> GEHOOR: Dit is nie geïnisialiseer. 881 00:38:45,190 --> 00:38:46,940 >> DAVID J. MALAN: Dis nie geïnisialiseer. 882 00:38:46,940 --> 00:38:49,370 So ons rekenaar altyd het fisiese geheue. 883 00:38:49,370 --> 00:38:50,544 Dit het altyd fisiese RAM. 884 00:38:50,544 --> 00:38:52,710 En daar is altyd nul se en een is daar, reg? 885 00:38:52,710 --> 00:38:54,626 Omdat ons met behulp van ons rekenaar die hele dag lank, 886 00:38:54,626 --> 00:38:57,210 jy gebruik die CS50 IDE of die bedieners hele dag lank. 887 00:38:57,210 --> 00:39:01,159 Sodat RAM óf het 'n paar nulle of iemand se of 'n nulle en ene. 888 00:39:01,159 --> 00:39:02,950 Maak nie saak of nie jy gebruik hulle. 889 00:39:02,950 --> 00:39:05,270 Jy kan nie net leeg ruimtes waar jy wil stukkies. 890 00:39:05,270 --> 00:39:06,850 Hulle is óf nulle en ene. 891 00:39:06,850 --> 00:39:09,610 >> So dit blyk dat temp, want ons het dit nog nie geïnisialiseer, 892 00:39:09,610 --> 00:39:14,580 ons het die 32 stukkies, maar hulle het nie geïnisialiseer om enige bekende waardes. 893 00:39:14,580 --> 00:39:18,110 So wat hulle vroeër was die meeste onlangs gebruik for-- diegene 32 bits-- 894 00:39:18,110 --> 00:39:23,000 ons is maar net die sien van die artefakte van 'n paar vorige gebruik van die spesifieke 32 895 00:39:23,000 --> 00:39:23,500 stukkies. 896 00:39:23,500 --> 00:39:27,780 So gou as ek klik stap oor al is, Sjoe, temp gaan om die waarde 1 te kry. 897 00:39:27,780 --> 00:39:31,600 En as ek dit weer doen, 'n is gaan wees gegewe die waarde 2 898 00:39:31,600 --> 00:39:33,830 en dan b gaan gegee word om die waarde 1. 899 00:39:33,830 --> 00:39:36,390 >> En so wat is lekker nou op hierdie punt in die verhaal 900 00:39:36,390 --> 00:39:39,750 is dat die debugger is wys my, super stadig 901 00:39:39,750 --> 00:39:42,640 op my eie pas, wat die toestand van Swap is. 902 00:39:42,640 --> 00:39:47,490 Maar let op die top hier, kennisgewing dat die oproep stapel eintlik 903 00:39:47,490 --> 00:39:49,180 het twee lae om dit te. 904 00:39:49,180 --> 00:39:53,240 Nou is die een wat uitgelig is, soos Swap, as ek op Main plaas, 905 00:39:53,240 --> 00:39:57,100 sien hoe die plaaslike veranderlikes omdat die ontwikkelaar kan net hop 906 00:39:57,100 --> 00:39:59,740 rond en gaan in 'n verskillende omvang. 907 00:39:59,740 --> 00:40:04,070 So selfs al is ons almal om dit te doen werk en korrek uitruiling A en B, 908 00:40:04,070 --> 00:40:09,080 as ek gaan heen en weer tussen Swap waar a 2 en b is 1 en Main, 909 00:40:09,080 --> 00:40:11,851 het Main geraak het nie? 910 00:40:11,851 --> 00:40:12,350 Geen. 911 00:40:12,350 --> 00:40:13,930 So, wat is die afhaal hier? 912 00:40:13,930 --> 00:40:18,200 Wel, dit blyk dat enige tyd jy 'n funksie roep soos Swap, 913 00:40:18,200 --> 00:40:21,600 en jy het dit argumente, slaag wat jy verby die funksie Swap 914 00:40:21,600 --> 00:40:24,730 in hierdie geval is 'n afskrif van daardie argumente. 915 00:40:24,730 --> 00:40:28,620 So as x en y elke onderskeidelik 32 stukkies, wat Swap is om 916 00:40:28,620 --> 00:40:30,760 is twee nuwe plaaslike veranderlikes, of argumente, 917 00:40:30,760 --> 00:40:34,380 bekend as 'n en-b, maar dit is arbitrêre names-- maar die patroon van die nulle 918 00:40:34,380 --> 00:40:39,520 en dié van binnekant a en b opgelyn identies aan x en y 919 00:40:39,520 --> 00:40:42,610 maar hulle is nie die dieselfde as x en y. 920 00:40:42,610 --> 00:40:46,880 >> Dit is asof Main het op sy stuk papier die nommer 1 en 2 vir x en y, 921 00:40:46,880 --> 00:40:49,260 en dan wanneer dit hande wat stuk papier te ruil, 922 00:40:49,260 --> 00:40:51,970 Swap baie vinnig kry sy eie pen, skryf neer 923 00:40:51,970 --> 00:40:56,240 1 en 2 op sy eie vel papier, hande terug die oorspronklike xy om Main 924 00:40:56,240 --> 00:40:58,790 en dan doen sy eie ding met a en b. 925 00:40:58,790 --> 00:41:01,940 En dit is nou super belangrik omdat dit het nontrivial implikasies 926 00:41:01,940 --> 00:41:06,260 vir eintlik skryf korrekte kode want dit wil voorkom asof ons nie kan ruil 927 00:41:06,260 --> 00:41:07,500 twee veranderlikes. 928 00:41:07,500 --> 00:41:09,150 >> Ek het 'n korrekte Swap funksie geskryf. 929 00:41:09,150 --> 00:41:12,770 Ons het dit geïmplementeer met Lauren as 'n korrekte swap funksie in werklikheid, 930 00:41:12,770 --> 00:41:16,700 maar blykbaar nie een van daardie sake as jy nie kan nie eintlik 931 00:41:16,700 --> 00:41:19,530 ruil twee waardes permanent. 932 00:41:19,530 --> 00:41:21,970 Sodat ons 'n ander manier moet om werklik te kry op hierdie, 933 00:41:21,970 --> 00:41:24,472 en ons moet in staat wees om eintlik die probleem op te los. 934 00:41:24,472 --> 00:41:27,180 En dit blyk out-- en ons sal kom terug na hierdie spesifieke prentjie 935 00:41:27,180 --> 00:41:30,500 voordat long-- dit is een manier wat jy dalk jou rekenaar se geheue te trek. 936 00:41:30,500 --> 00:41:31,460 Dit is net 'n reghoek. 937 00:41:31,460 --> 00:41:32,960 Jy kan dit enige teken aantal maniere, maar dit is 938 00:41:32,960 --> 00:41:35,740 gerieflik om dit te trek as 'n reghoek vir die volgende rede. 939 00:41:35,740 --> 00:41:40,040 >> Ons gaan vandag begin en verder praat oor die sogenaamde stapel. 940 00:41:40,040 --> 00:41:43,870 En die stapel is net 'n stuk van RAM-- 'n stuk van memory-- 941 00:41:43,870 --> 00:41:47,100 wat funksioneer toegang wanneer hulle genoem. 942 00:41:47,100 --> 00:41:49,800 En so is dit blyk dat by die heel onderkant van die stapel 943 00:41:49,800 --> 00:41:53,590 is waar al die plaaslike veranderlikes Main se en org C en org V en al daardie dinge 944 00:41:53,590 --> 00:41:56,950 gaan om te gaan by verstek. En as Main roep 'n ander funksie soos Swap, 945 00:41:56,950 --> 00:42:00,330 Wel, Swap gaan na 'n ander te kry laag geheue bo dit. 946 00:42:00,330 --> 00:42:04,490 >> En so net om jou 'n vinnige oppervlakkige gee prentjie van hierdie, as ek gaan oor here-- 947 00:42:04,490 --> 00:42:09,450 en laat my spieël op die oorhoofse as well-- wat regtig ek het, 948 00:42:09,450 --> 00:42:12,100 As ons omgee net oor die onderkant van hierdie foto vir nou, 949 00:42:12,100 --> 00:42:15,070 is dat wanneer ek 'n program uit te voer en Main kry genoem, 950 00:42:15,070 --> 00:42:18,330 Main gegee 'n stuk van RAM in my rekenaar wat 951 00:42:18,330 --> 00:42:20,060 aan die onderkant van hierdie sogenaamde stapel. 952 00:42:20,060 --> 00:42:22,143 En ek gaan om dit te trek doelbewus as 'n vierkant. 953 00:42:22,143 --> 00:42:24,540 So dit is soos 32 stukkies of vier grepe. 954 00:42:24,540 --> 00:42:28,790 En as dit hooffunksie het 'n veranderlike genoem x met 'n waarde van 1 955 00:42:28,790 --> 00:42:32,626 en dit het 'n veranderlike genoem y met die waarde van 2, dis 956 00:42:32,626 --> 00:42:35,750 soos die neem van hierdie splinter van geheue wat Main gegee is deur die bedryfstelsel 957 00:42:35,750 --> 00:42:38,850 stelsel en deel dit op sodat die eerste plaaslike veranderlike gaan hier, 958 00:42:38,850 --> 00:42:40,930 die tweede een gaan hier, en dit is dit. 959 00:42:40,930 --> 00:42:45,590 >> Wanneer Main oproepe Swap, Swap kry sy eie deel van die geheue 960 00:42:45,590 --> 00:42:48,280 dat ons sal trek soos hierdie van die bedryfstelsel, 961 00:42:48,280 --> 00:42:50,820 en dit gaan om die eie plaaslike veranderlikes gebaseer 962 00:42:50,820 --> 00:42:53,825 op ons implementering vroeër met plaaslike veranderlikes 'n 963 00:42:53,825 --> 00:42:58,010 en b wat aanvanklik kry die waardes 1 en 2. 964 00:42:58,010 --> 00:43:00,450 Maar dan, sodra die Swap kode voer, 965 00:43:00,450 --> 00:43:03,760 en Lauren eintlik swaps die PB en melk, wat gebeur? 966 00:43:03,760 --> 00:43:09,030 Wel, dit 2 steeds 'n 1, hierdie 1 is besig om 'n 2, en, by the way, 967 00:43:09,030 --> 00:43:13,360 daar is 'n tydelike veranderlike wat die wese gebruik dat die hele tyd wat uiteindelik 968 00:43:13,360 --> 00:43:14,470 gaan weg. 969 00:43:14,470 --> 00:43:16,720 Maar dit maak nie saak hoeveel werk wat jy doen 970 00:43:16,720 --> 00:43:22,160 in hierdie lyn of-- in hierdie geheue spasie, x en y is heeltemal onaangeraak. 971 00:43:22,160 --> 00:43:26,320 >> Sodat ons 'n manier van gee nodig Ruil en funksies soos dit 972 00:43:26,320 --> 00:43:32,640 geheime, as jy wil, om funksies like-- om geheue soos x en y. 973 00:43:32,640 --> 00:43:35,110 So laat ons neem 'n blik op 'n voorbeeld wat help 974 00:43:35,110 --> 00:43:38,220 ons sien presies wat was gaan oor hierdie hele tyd. 975 00:43:38,220 --> 00:43:40,284 Ek gaan om voort te gaan en maak Vergelyk Zero. 976 00:43:40,284 --> 00:43:42,200 En ek gaan om te sluit ons debugger, ek gaan 977 00:43:42,200 --> 00:43:44,360 om hierdie scary soek boodskap sluit die regverdige sê, wag 'n minuut, 978 00:43:44,360 --> 00:43:45,800 jy is in die middel debugging. 979 00:43:45,800 --> 00:43:48,383 Ek gaan hierdie blad hier wegsteek net om terug te gaan eenvoud. 980 00:43:48,383 --> 00:43:50,160 So moenie bekommerd wees as GDB is vermoor. 981 00:43:50,160 --> 00:43:53,910 Dit beteken net dat die program het is op te hou, doelbewus in hierdie geval, 982 00:43:53,910 --> 00:43:54,820 deur My nie. 983 00:43:54,820 --> 00:43:57,700 >> En nou Vergelyk Zero doen dit. 984 00:43:57,700 --> 00:44:00,110 Ek gebruik die CS50 biblioteek in standaard I / O. 985 00:44:00,110 --> 00:44:04,319 Ek het 'n hoof funksie wat die eerste keer het sê, sê iets, en kry 'n string. 986 00:44:04,319 --> 00:44:06,110 Weer en sê dit dan kry 'n ander string. 987 00:44:06,110 --> 00:44:09,910 En sien dat hierdie twee stringe geroep s en t, onderskeidelik. 988 00:44:09,910 --> 00:44:12,910 En nou hierdie program Vergelyk Nul, sy doel in die lewe, 989 00:44:12,910 --> 00:44:15,470 dit veronderstel is om my te vertel, het ek tik dieselfde ding? 990 00:44:15,470 --> 00:44:16,910 En so gaan ek terug na week een. 991 00:44:16,910 --> 00:44:19,950 Ek gebruik my gelyk gelyk operateur wat is die kwaliteit operateur. 992 00:44:19,950 --> 00:44:22,220 Nie die opdrag operateur, die operateur gelykheid. 993 00:44:22,220 --> 00:44:23,890 Ek is net te vergelyk s en t. 994 00:44:23,890 --> 00:44:27,470 >> So laat eintlik gaan voort en doen dit. 995 00:44:27,470 --> 00:44:32,680 En ek gaan om voort te gaan en maak Vergelyk Zero. 996 00:44:32,680 --> 00:44:35,110 Ek gaan ./comparezero doen. 997 00:44:35,110 --> 00:44:37,150 En ek gaan om te gaan voort en iets te sê 998 00:44:37,150 --> 00:44:43,450 soos, kom ons doen ma in klein en hoe oor ma in hoofletters. 999 00:44:43,450 --> 00:44:45,034 En natuurlik het ek verskillende dinge te tik. 1000 00:44:45,034 --> 00:44:45,533 Alles reg. 1001 00:44:45,533 --> 00:44:46,570 Dit is te verwagte. 1002 00:44:46,570 --> 00:44:47,640 >> Kom ons weer uit te voer nie. 1003 00:44:47,640 --> 00:44:49,740 Beide kere doen klein, klein. 1004 00:44:49,740 --> 00:44:51,490 Wat lyk super identies aan my. 1005 00:44:51,490 --> 00:44:52,930 Betree. 1006 00:44:52,930 --> 00:44:53,430 OK. 1007 00:44:53,430 --> 00:44:55,804 Miskien is dit net vreemd, want dit is nie my smaak grammatika. 1008 00:44:55,804 --> 00:44:59,930 So kom ons doen 'n kapitale MOM, kapitaal MOM, identies. 1009 00:44:59,930 --> 00:45:01,490 Verskillende dinge. 1010 00:45:01,490 --> 00:45:03,907 >> So hoekom is dit? 1011 00:45:03,907 --> 00:45:06,240 Wel, wat eintlik gaan op onder die kap hier? 1012 00:45:06,240 --> 00:45:08,180 So laat ons gaan terug oor hier vir 'n oomblik 1013 00:45:08,180 --> 00:45:10,910 en kyk wat GetString is eintlik. 1014 00:45:10,910 --> 00:45:13,385 Wanneer jy GetString noem, dit is 'n funksie wat ons 1015 00:45:13,385 --> 00:45:16,510 onsself geskryf het en dit op 'n manier kry 'n volgorde van die karakters van die gebruiker. 1016 00:45:16,510 --> 00:45:20,280 En laat ons aanneem dat die eerste keer as ek bel GetString, wat gee my 1017 00:45:20,280 --> 00:45:21,930 'n stuk van die geheue wat lyk soos hierdie. 1018 00:45:21,930 --> 00:45:26,990 En as ek getik in alle klein m-o-m-- en wat gaan nadat dit? 1019 00:45:26,990 --> 00:45:28,840 Net 'n vinnige gesonde verstand tjek. 1020 00:45:28,840 --> 00:45:29,780 >> Agteroorskuinsstreep nul. 1021 00:45:29,780 --> 00:45:30,510 Ons weet dat. 1022 00:45:30,510 --> 00:45:32,784 En onthou dat ons gespeel rond met die naam Zamila se 1023 00:45:32,784 --> 00:45:34,950 en 'n klomp van die ander name wanneer Rob is hier op soek 1024 00:45:34,950 --> 00:45:36,280 op wat gaan aan die binnekant van die geheue. 1025 00:45:36,280 --> 00:45:37,780 Sodat storie is presies dieselfde. 1026 00:45:37,780 --> 00:45:40,160 Dit is wat GetString terugkeer na my. 1027 00:45:40,160 --> 00:45:44,780 Nou, my kode 'n oomblik gelede gestoor die terugkeer waarde van GetString 1028 00:45:44,780 --> 00:45:47,510 in 'n veranderlike genaamd s. 1029 00:45:47,510 --> 00:45:51,390 En dan is die tweede keer wat ek dit noem, dit gestoor in 'n veranderlike genoem t. 1030 00:45:51,390 --> 00:45:55,070 >> So as ek gaan hier, ek moet om hierdie plaaslike variable-- trek 1031 00:45:55,070 --> 00:45:59,610 en ek oor die algemeen gaan trek 'n string as just-- ons sal 1032 00:45:59,610 --> 00:46:02,360 noem dit s-- as 'n klein vierkant hier. 1033 00:46:02,360 --> 00:46:09,760 En nou, somehow-- hoe werk ma gaan binne hierdie veranderlike s? 1034 00:46:09,760 --> 00:46:12,010 Wel, ons moet teruggaan eerste beginsels hier. 1035 00:46:12,010 --> 00:46:15,660 Wat is GetString eintlik terugkeer? 1036 00:46:15,660 --> 00:46:19,030 >> So dit blyk dat M-O-M backslash nul, en 'n aantal 1037 00:46:19,030 --> 00:46:22,364 van ander snare in die geheue soos Zamila en Rob of Andy of enige ander, 1038 00:46:22,364 --> 00:46:24,280 is natuurlik in ons RAM of geheue se rekenaar. 1039 00:46:24,280 --> 00:46:27,760 En jou geheue het like-- jy 'n gig RAM, twee gigs RAM, 1040 00:46:27,760 --> 00:46:30,860 of 'n miljard of twee miljard grepe, of miskien selfs meer van hierdie dae. 1041 00:46:30,860 --> 00:46:34,070 So laat ons veronderstel vir doeleindes vandag se dat dit maak nie saak hoe ons tel 1042 00:46:34,070 --> 00:46:36,640 hulle, maar ons kan elke nommer van daardie miljard of twee miljard 1043 00:46:36,640 --> 00:46:37,880 of 4000000000 grepe. 1044 00:46:37,880 --> 00:46:42,240 >> En laat ons net sê dat arbitrêr dit is die eerste hap, tweede byt, 1045 00:46:42,240 --> 00:46:43,380 derde, vierde. 1046 00:46:43,380 --> 00:46:46,570 Ek is doelbewus nie vir die gebruik van nul vandag, maar ons sal terug kom. 1047 00:46:46,570 --> 00:46:49,570 So met ander woorde, as dit is die heel eerste keer dat ek die gebruik van die program, 1048 00:46:49,570 --> 00:46:52,715 Ek is maar net gelukkig en die eerste byt is op plek mens dan twee 1049 00:46:52,715 --> 00:46:53,590 dan drie as vier. 1050 00:46:53,590 --> 00:46:57,430 En as ek gehou teken, Posbus nommer twee biljoen sal hier te wees nie. 1051 00:46:57,430 --> 00:47:02,200 >> So wat dink jy dan GetString terug eintlik? 1052 00:47:02,200 --> 00:47:06,010 Dit is nie die terugkeer van M-O-M backslash zero per se, want dit duidelik 1053 00:47:06,010 --> 00:47:08,180 sal nie pas in die boks wat ek geteken het. 1054 00:47:08,180 --> 00:47:11,210 So wat anders kan eintlik GetString terugkeer al hierdie weke? 1055 00:47:11,210 --> 00:47:14,410 1056 00:47:14,410 --> 00:47:16,820 Die antwoord is op die raad hier iewers. 1057 00:47:16,820 --> 00:47:20,390 Jy kan nie pas M-O-M backslash nul, so wat kan sin plaas te maak? 1058 00:47:20,390 --> 00:47:23,424 As jy het super slim te wees, om op die sogenaamde ingenieurswese hoed, 1059 00:47:23,424 --> 00:47:24,340 wat jy kan terugkeer? 1060 00:47:24,340 --> 00:47:27,340 Wat is die minste hoeveelheid van die inligting jy kan nog steeds opbrengs wat sou 1061 00:47:27,340 --> 00:47:30,610 laat vind M-O-M in die geheue? 1062 00:47:30,610 --> 00:47:31,270 Ja? 1063 00:47:31,270 --> 00:47:31,950 >> GEHOOR: Een. 1064 00:47:31,950 --> 00:47:32,200 >> DAVID J. MALAN: Een. 1065 00:47:32,200 --> 00:47:33,021 En waarom die een? 1066 00:47:33,021 --> 00:47:35,520 GEHOOR: Omdat dit sal vertel jy waar om te gaan [onhoorbaar]. 1067 00:47:35,520 --> 00:47:38,391 1068 00:47:38,391 --> 00:47:39,390 DAVID J. MALAN: Presies. 1069 00:47:39,390 --> 00:47:44,300 Ek gaan net na die adres terugkeer van die string wat ek gekry het. 1070 00:47:44,300 --> 00:47:46,570 Die adres in hierdie geval is plek een. 1071 00:47:46,570 --> 00:47:51,280 So wat werklik word gestoor in s-- en elke string veranderlike dus far-- 1072 00:47:51,280 --> 00:47:53,430 het nou net die adres van daardie string. 1073 00:47:53,430 --> 00:47:57,840 >> Intussen, as ek roep GetString 'n tweede keer en ek 1074 00:47:57,840 --> 00:48:03,300 tik in letterlik dieselfde thing-- M-O-M met lowercase-- M-O-M 1075 00:48:03,300 --> 00:48:06,200 en 'n ander backslash nul, en nou miskien my program se 1076 00:48:06,200 --> 00:48:09,820 reeds vir 'n geruime tyd so miskien hierdie is 10, is dit plek 11, dit is 12, 1077 00:48:09,820 --> 00:48:10,700 dit is 13. 1078 00:48:10,700 --> 00:48:13,590 Die rekenaars met behulp van 'n paar ander geheue vir watter rede ookal. 1079 00:48:13,590 --> 00:48:18,172 Wat nou gaan in my tweede veranderlike in my program t? 1080 00:48:18,172 --> 00:48:19,390 10. 1081 00:48:19,390 --> 00:48:20,050 Presies. 1082 00:48:20,050 --> 00:48:23,910 >> En so wanneer ons kyk na die bronkode van hierdie program 1083 00:48:23,910 --> 00:48:26,550 waar ek net probeer om die twee waardes te vergelyk, 1084 00:48:26,550 --> 00:48:32,180 is s gelyk gelyk aan t, wat is die ooglopende menslike antwoord? 1085 00:48:32,180 --> 00:48:34,890 Net geen want 1 is nie gelyk 10. 1086 00:48:34,890 --> 00:48:36,861 En so hierin lê 'n geleentheid vir ons regtig 1087 00:48:36,861 --> 00:48:39,610 om net terug te, weer, eerste beginsels en dink oor, wel, 1088 00:48:39,610 --> 00:48:41,110 wat gaan aan onder die enjinkap? 1089 00:48:41,110 --> 00:48:43,240 Ons het gepraat oor bits en bytes en geheue, 1090 00:48:43,240 --> 00:48:46,820 maar dit is eintlik nuttig om te verstaan want as jy GetString noem, 1091 00:48:46,820 --> 00:48:50,280 selfs al dink ons ​​dit is terugkeer M-O-M of string ma 1092 00:48:50,280 --> 00:48:53,120 of Andy of Zamila of die wil, tegnies 1093 00:48:53,120 --> 00:48:55,510 dit is net die terugkeer van die adres van daardie deel van die geheue. 1094 00:48:55,510 --> 00:48:56,910 >> Maar dit is OK. 1095 00:48:56,910 --> 00:49:00,570 Want hoe weet ek waar die string eindig? 1096 00:49:00,570 --> 00:49:03,840 As ek net is gegee die begin? 1097 00:49:03,840 --> 00:49:05,380 Wel, agteroorskuisstreep nul, reg? 1098 00:49:05,380 --> 00:49:08,800 Net in lineêre tyd wat ek kan druk met die druk def M-O-M. 1099 00:49:08,800 --> 00:49:11,820 En so gou as ek sien backslash zero, ek gee nie om waar ek begin het, 1100 00:49:11,820 --> 00:49:14,950 Ek weet reeds implisiet waar ek nodig het om te eindig. 1101 00:49:14,950 --> 00:49:18,700 >> En so vandag dui die beginning-- en laat my dit doen dramaties omdat ons 1102 00:49:18,700 --> 00:49:21,800 het deur 'n baie moeite gedoen om kry hierdie hier opleiding wheels-- 1103 00:49:21,800 --> 00:49:29,840 So vandag is die opleiding wiele begin om af te kom en ons te openbaar op least-- 1104 00:49:29,840 --> 00:49:31,373 >> [Applous] 1105 00:49:31,373 --> 00:49:33,220 1106 00:49:33,220 --> 00:49:36,160 >> Dit was goed om die reis die moeite werd vanoggend teiken, ja? 1107 00:49:36,160 --> 00:49:39,600 So now-- daar, dit blyk uit nie so iets soos tou. 1108 00:49:39,600 --> 00:49:41,140 String bestaan ​​nie. 1109 00:49:41,140 --> 00:49:43,760 Dit is 'n sinoniem wat ons gehad het binnekant van die CS50 biblioteek. 1110 00:49:43,760 --> 00:49:48,660 Voortaan gaan ons begin bel s en t nie snare maar char sterre. 1111 00:49:48,660 --> 00:49:51,180 En die kar ster sal ons terg uitmekaar voor lank. 1112 00:49:51,180 --> 00:49:53,510 Maar dit is om te sê, dat selfs as ons voortgaan 1113 00:49:53,510 --> 00:49:56,180 gebruik van GetString vir nou, tegnies ek moet 1114 00:49:56,180 --> 00:49:59,010 wees sê char ster en char ster. 1115 00:49:59,010 --> 00:50:01,720 >> En dit blyk dat die ster wat gaan om aan te dui is iets 1116 00:50:01,720 --> 00:50:04,340 bekend as 'n wyser of 'n adres. 1117 00:50:04,340 --> 00:50:06,110 En in die feit, 'n teaser vir wat voorlê 1118 00:50:06,110 --> 00:50:09,760 is dit 20 tweede clip van ons vriend Nick Parlante by Stanford 1119 00:50:09,760 --> 00:50:12,927 wat 'n geruime tyd gelede, spandeer 'n belaglike bedrag van die tyd, 1120 00:50:12,927 --> 00:50:15,010 as die beste wat ek kan sê in sy kombuis of sy kelder, 1121 00:50:15,010 --> 00:50:17,140 maak claymation bekendstelling aan die wêreld 1122 00:50:17,140 --> 00:50:20,010 'n karakter genaamd Binky met wie ons sal 1123 00:50:20,010 --> 00:50:22,010 volgende keer bekendgestel word aan wysers. 1124 00:50:22,010 --> 00:50:24,588 So hier is 'n voorbeeld van wat om te kom. 1125 00:50:24,588 --> 00:50:26,370 >> [Video speel] 1126 00:50:26,370 --> 00:50:27,510 >> Hey, Binky. 1127 00:50:27,510 --> 00:50:28,260 Word wakker. 1128 00:50:28,260 --> 00:50:30,672 Dit is tyd vir wyser pret. 1129 00:50:30,672 --> 00:50:31,616 >> -Wat is dit? 1130 00:50:31,616 --> 00:50:33,032 Meer inligting oor die riglyne? 1131 00:50:33,032 --> 00:50:34,450 O, goody. 1132 00:50:34,450 --> 00:50:35,431 >> [Einde afspeel] 1133 00:50:35,431 --> 00:50:38,055 DAVID J. MALAN: En op daardie noot, Ons sal sien dat jy op Woensdag. 1134 00:50:38,055 --> 00:50:47,590 1135 00:50:47,590 --> 00:50:48,090 Alles reg. 1136 00:50:48,090 --> 00:50:48,740 Wie is dans? 1137 00:50:48,740 --> 00:50:49,240 Kom op. 1138 00:50:49,240 --> 00:50:50,330 Wie is dans? 1139 00:50:50,330 --> 00:50:51,820 Jy wil my om dit te kry begin? 1140 00:50:51,820 --> 00:50:53,770 Ek kry dit begin het. 1141 00:50:53,770 --> 00:50:54,270 WOOOO! 1142 00:50:54,270 --> 00:51:04,070 1143 00:51:04,070 --> 00:51:07,580 >> LAUREN: Sweet fancy Moses.