ቫርግ እንዲህ ይላል:
ደህና ከሰአት, ይህ ተግባር እንዴት ስሌቶችን እንደሚያከናውን በትክክል መረዳት አልችልም.
{
(n==1) ከተመለሰ 1; // አዲሱ ዋጋ 1 ከሆነ, ከዚያ ከ 1 ጋር እንጨምራለን, እና ከቀዳሚው ጋር አይደለም. ምክንያቱም ቀዳሚው ዜሮ ነው። እና መደመር 1+0 ማለቂያ የሌለው ይሆናል።
ያለበለዚያ ድምር (n-1)+n መመለስ; // ግን n>1 ከሆነ፣ ከዚያ እስከ n ድረስ ካለው የሁሉም ንጥረ ነገሮች ድምር ጋር እኩል ከሆነው ከቀደመው እሴት ጋር ይጨምሩ
}
በእኔ ግንዛቤ, በ n ውስጥ 5, ሁኔታው አይመሳሰልም ከዚያም ይረካል ይህ ኮድድምር(n-1)+n ማለትም በቅንፍ ውስጥ በመቀነስ የተገኘ ነገር ወደ 5 ተጨምሯል ነገር ግን (5 - 1)+5 ምንድን ነው እና ከሆነስ ይህን የሂሳብ አሰራር የሚያቆመው ምንድን ነው:: የቀደመ አንድ እሴት ምንድን ነው ፣ ከየት ነው የመጣው ፣ ምን እኩል ነው?
አዎ ፣ ሁሉም ነገር ማለት ይቻላል እኔ እንደተረዳሁት ነው (በመጨረሻው አንቀፅ ውስጥ ድግግሞሽ አሳይተዋል)) ፣ ግን ጥያቄው ይቀራል - ድምር እንዴት ተገኝቷል ፣ ከዚያ በስክሪኑ ላይ የሚታየው?
ለኔ ከDev C++ ጋር እየሰራሁ ነው። ይህ ምሳሌመጠኑን ==15 ያሳያል፣ በምሳሌው ላይ እንደተፃፈው ከቆጠሩ፣ መጠኑ የተለየ ይሆናል።
ከላይ ጽፌ ነበር፣ (5-1)+5=4+5=9 እንውሰድ
:
1+2+3+4+5 = 15. ምሳሌው በትክክል ይወጣል.(5) // ለተግባሩ 5 ሰጠን, ከአንድ ጋር እኩልነትን አረጋግጧል. እኩል አይደለም, ተግባሩን እንደገና ይባላል, 5-1 ወደ ውስጥ በማለፍ
(5-1+(5)) //...
(4-1+(5-1+(5)))
(3-1+(4-1+(5-1+(5))))
(2-1+(3-1+(4-1+(5-1+(5)))))2-1 == 1፣ ተግባሩን መጥራት ጨርሷል።
(2-1+(3-1+(4-1+(5-1+(5))))) == 15
ይህ ነው ውጤቱ።
እዚህ የተግባሩ ውጤት የመጀመሪያዎቹ ሁለት ቁጥሮች ልዩነት ነው, እና n የቀረው የቀኝ ጎን ነው
__________________________________
ተግባሩን በትክክል መረዳት እና እንደ ስሌት እሴት መቀበል እና እንደ ተለዋዋጭ አለመረዳት ብቻ ያስፈልግዎታል። እሱ ከተለዋዋጭ ጋር ተመሳሳይ ነው ፣ ግን ወደ ስሌት ቋሚ ቅርብ ነው ፣ ምንም እንኳን ቋሚ ባይሆንም ፣ በቀላሉ በዚህ መንገድ ለመረዳት የበለጠ ምቹ ነው።
አዎ, አዎ, አዎ, የተረዳሁትን ለመጻፍ ጊዜ አላገኘሁም, ሁሉም ነገር ትክክል ነው, የሆነ ነገር ወዲያውኑ አላለፈም. እናመሰግናለን ጥሩ ጣቢያ))
እና አሁንም በ 8 ኛው መስመር ውስጥ ሙሉ በሙሉ ምክንያታዊ አይደለም የተመለሰውን ቁጥር ከ 1 ወደ 2 መመለሻ ከቀየሩ, መጠኑ ወደ 16 ይቀየራል. ይህ ሁኔታ ከ 9 ኛው መስመር ጋር እንዴት ይዛመዳል?
ከዚህ ጋር, እንደዚሁም, ሁሉም ነገር ግልጽ ነው, መመለስ ብቻ 2 እጦቱን ወደ ድምር ይጨምራል, ለመናገር.
:
ተጨማሪው ኮከብ ሳይሆን እነዚህ ሁለት እና -3 ከፃፉ አንድ ጊዜ ሲደመር ሦስቱን ይቀንሳል, ወዘተ.
አጠቃላይ አመክንዮ ማንኛውም ተደጋጋሚ ተግባር የመመለሻ ነጥብ ያስፈልገዋል።
ከዘጠነኛው መስመር ጋር ያለው ግንኙነት አንድ ቁጥር ከውስጥ ዋናው ሲጠራ ወደ ድምር ተግባር ይተላለፋል, ይህ ቁጥር በያንዳንዱ ጊዜ በአንድ (n-1) ይቀንሳል, ይህ ውጤት n-1 ምልክት ይደረግበታል. ከአንዱ ጋር እኩልነት እና እኩልነት እውነት ከሆነ፣ የተቀበለው ገንዘብ በሙሉ በዚያ ተመላሽ ውስጥ ካለው ቁጥር ጋር ይጠቃለል። አለበለዚያ አጠቃላይ ድምር በዚህ አዲስ n-1 ይጠቃለላል
ተደጋጋሚነት በሳይንስ መስክ ብቻ ሳይሆን በ ውስጥም የሚከሰት በጣም የተለመደ ክስተት ነው። የዕለት ተዕለት ኑሮ. ለምሳሌ፣ Droste effect፣ Sierpinski triangle፣ ወዘተ. በጣም ቀላሉ መንገድ ተደጋጋሚነትን ለማየት የዌብ ካሜራውን በኮምፒዩተር መከታተያ ስክሪን ላይ ማመላከት ነው፣ በተፈጥሮ፣ በመጀመሪያ በማብራት። ስለዚህ, ካሜራው የኮምፒዩተር ስክሪን ምስልን ይመዘግባል እና በዚህ ስክሪን ላይ ያሳየዋል, ልክ እንደ ዝግ ዑደት ያለ ነገር ይሆናል. በውጤቱም, ከዋሻው ጋር ተመሳሳይ የሆነ ነገር እናስተውላለን.
በፕሮግራም አወጣጥ ውስጥ ፣ ድግግሞሽ ከተግባሮች ጋር በቅርበት ይዛመዳል ፣ በፕሮግራም አወጣጥ ውስጥ እንደዚህ ያለ ነገር አለ ማለት ነው ተደጋጋሚ ተግባር. በቀላል ቃላት, ተደጋጋሚነት የአንድ ተግባር (ዘዴ) አካል በራሱ ፍቺ ነው፣ ማለትም እሱ ራሱ በቀጥታ (በአካሉ ውስጥ) ወይም በተዘዋዋሪ (በሌላ ተግባር) የሚጠራ ተግባር ነው። የተለመደ ተደጋጋሚ ችግሮችተግባራቶቹ ናቸው: ማግኘት n!, Fibonacci ቁጥሮች. እንደነዚህ ያሉ ችግሮችን አስቀድመን ፈትተናል, ግን loops በመጠቀም, ማለትም, በተደጋጋሚ. በጥቅሉ አነጋገር፣ በድግግሞሽ የሚፈታው ነገር ሁሉ በተደጋጋሚ ሊፈታ ይችላል፣ ማለትም፣ ተደጋጋሚ ተግባርን በመጠቀም። ጠቅላላው መፍትሄ የሚመጣው ዋናውን ወይም እንደ መሰረቱን ጉዳይ ለመፍታት ነው. እንደ ድግግሞሽ እርምጃ ወይም ተደጋጋሚ ጥሪ ያለ ነገር አለ። ውስብስብ ችግርን ለመፍታት ተደጋጋሚ ተግባር በተጠራበት ሁኔታ (የመሠረቱ ጉዳይ አይደለም) ፣ የተወሰነ ቁጥር ተደጋጋሚ ጥሪዎችወይም አንድን ተግባር ወደ ቀላል ለመቀነስ እርምጃዎች። እና እኛ እስክንደርስ ድረስ መሠረታዊ መፍትሔ. n ያሰላል ተደጋጋሚ ተግባር የሚያውጅ ፕሮግራም እናዳብር!
"stdafx.h" #ያካትቱ
ኮት
// ኮድ ኮድ :: ያግዳል
// Dev-C ++ ኮድ
ውስጥ መስመር 7፣9፣21የመረጃው አይነት ሳይፈረም ታውጇል ረጅም int , የፋብሪካው ዋጋ በጣም በፍጥነት ስለሚጨምር ለምሳሌ ቀድሞውኑ 10! = 3,628,800 የውሂብ አይነት መጠን በቂ ካልሆነ, ውጤቱ ሙሉ በሙሉ የተሳሳተ እሴት ይሆናል. ኮዱ n ለማግኘት ከሚያስፈልገው በላይ ኦፕሬተሮችን ያውጃል። ይህ የሚደረገው ከሩጫ በኋላ ፕሮግራሙ በእያንዳንዱ የድግግሞሽ ጥሪዎች ደረጃ ምን እንደሚከሰት ያሳያል። እባክዎ የደመቁትን የኮድ መስመሮችን ያስተውሉ፣ መስመር 23፣24፣28ለ n ተደጋጋሚ መፍትሄ ነው! መስመር 23፣24የተደጋጋሚነት ተግባር መሰረታዊ መፍትሄዎች ናቸው, ማለትም, በተለዋዋጭ ውስጥ ያለው ዋጋ ልክ እንደ ረከ 1 ወይም 0 ጋር እኩል ይሆናል (1! = 1 እና 0! = 1 ስለምናውቅ), ተደጋጋሚ ጥሪዎች ይቆማሉ, እና እሴቶቹ ለእያንዳንዱ ተደጋጋሚ ጥሪ መመለስ ይጀምራሉ. ለመጀመሪያው ተደጋጋሚ ጥሪ ዋጋ ሲመለስ ፕሮግራሙ የተሰላውን ፋክተር ዋጋ ይመልሳል። ውስጥ መስመር 28ፋክተሪያል () ተግባር እራሱን ይጠራል, ግን ክርክሩ አንድ ያነሰ ነው. አንድ የተወሰነ መፍትሄ ለመድረስ ክርክሩ በእያንዳንዱ ጊዜ ይቀንሳል. የፕሮግራሙ ውጤት (ስእል 1 ይመልከቱ).
አስገባ n!፡ 5 ደረጃ 1 ውጤት= 0 ደረጃ 2 ውጤት= 0 ደረጃ 3 ውጤት= 0 ደረጃ 4 ውጤት= 0 5!=120
ምስል 1 - በ C ++ ውስጥ ድግግሞሽ
በፕሮግራሙ ውጤት ላይ በመመርኮዝ እያንዳንዱ እርምጃ በግልጽ የሚታይ ሲሆን በእያንዳንዱ ደረጃ ላይ ያለው ውጤት ዜሮ ነው, ከመጨረሻው ተደጋጋሚ ጥሪ በስተቀር. አምስት ፋብሪካዎችን ማስላት አስፈላጊ ነበር. ፕሮግራሙ አራት ተደጋጋሚ ጥሪዎችን አድርጓል, እና በአምስተኛው ጥሪ ላይ የመሠረት መያዣው ተገኝቷል. እና ፕሮግራሙ ለመሠረታዊ ጉዳይ መፍትሄ ካገኘ በኋላ, የቀደሙትን እርምጃዎች ፈትቶ አጠቃላይ ውጤቱን አወጣ. በስእል 1 ውስጥ አራት ደረጃዎች ብቻ ናቸው የሚታዩት ምክንያቱም በአምስተኛው ደረጃ ከፊል መፍትሄ ተገኝቷል, በመጨረሻም የመጨረሻውን መፍትሄ መለሰ, ማለትም 120. ምስል 2 የእንደገና ስሌት እቅድ 5 ያሳያል. ስዕሉ በግልጽ እንደሚያሳየው የመጀመሪያው ውጤት አንድ የተወሰነ መፍትሄ ሲደርስ ይመለሳል, ነገር ግን ከእያንዳንዱ ተደጋጋሚ ጥሪ በኋላ ወዲያውኑ አይደለም.
ምስል 2 - በ C ++ ውስጥ ድግግሞሽ
ስለዚህ 5 ለማግኘት! ማወቅ ያስፈልጋል 4! እና በ 5 ያባዙት; 4! = 4 * 3! ወዘተ. በስእል 2 ላይ በሚታየው ሥዕላዊ መግለጫ መሠረት ስሌቱ ልዩ ሁኔታን ለማግኘት ማለትም 1!, ከዚያ በኋላ ዋጋዎች ወደ እያንዳንዱ ተደጋጋሚ ጥሪ ይመለሳሉ. የመጨረሻው ተደጋጋሚ ጥሪ እሴቱን 5 ይመልሳል!
የፋብሪካዎችን ሰንጠረዥ ለማግኘት ፋብሪካውን ለማግኘት ፕሮግራሙን እንደገና እንሥራ። ይህንን ለማድረግ, የድግግሞሹን ተግባር የምንጠራበት ለ loop እናውጃለን.
ኮት // ኮድ ኮድ :: ያግዳል // Dev-C ++ ኮድ ውስጥ ለ (int k = 1; kመስመር 16 - 19 ተደጋጋሚ ተግባር የሚጠራበት loop ይገለጻል። በፕሮግራሙ ውስጥ አላስፈላጊ ነገሮች ሁሉ አስተያየት ተሰጥቷል. ፕሮግራሙን ከጀመሩ በኋላ, ፋብሪካዎችን ማስላት የሚያስፈልግበትን ዋጋ ማስገባት ያስፈልግዎታል. የፕሮግራሙ ውጤት በስእል 3 ይታያል. አስገባ n!፡ 14 1!=1 2!=2 3!=6 4!=24 5!=120 6!=720 7!=5040 8!=40320 9!=362880 10!=3628800 11!=3628800 11!=39916800 12 !=479001600 13!=6227020800 14!=87178291200 ምስል 3 - በ C ++ ውስጥ ድግግሞሽ አሁን ፋብሪካው ምን ያህል በፍጥነት እንደሚጨምር ማየት ይችላሉ, ውጤቱም ቀድሞውኑ 14 ነው! ትክክል አይደለም፣ ይህ የውሂብ አይነት መጠን አለመኖር ውጤት ነው። ትክክለኛው ዋጋ 14 ነው! = 87178291200። ሌላ የተለመደ ችግር እንይ - ተደጋጋሚነትን በመጠቀም የ Fibonacci ቁጥሮችን መፈለግ። ከዚህ በታች እንደዚህ ላለው ችግር ተደጋጋሚ መፍትሄ ኮድ አለ። በመስመሩ ውስጥ ከ Fibonacci ተከታታይ የቁጥር መለያ ቁጥር ውስጥ እናስገባለን, እና ፕሮግራሙ ሁሉንም ቁጥሮች ከ Fibonacci ተከታታይ ያገኛል ተከታታይ ቁጥራቸው ከገባው ያነሰ ወይም እኩል ነው. ኮት // ኮድ ኮድ :: ያግዳል // fibonacci.cpp፡ ለኮንሶል አፕሊኬሽኑ የመግቢያ ነጥቡን ይገልጻል። "stdafx.h" #ያካትቱ ውስጥ > የገባው_ቁጥር;ለ (int ቆጣሪ = 1; ቆጣሪ ከፋይቦናቺ ተከታታይ ቁጥር አስገባ፡ 30 1 = 0 2 = 1 3 = 1 4 = 2 5 = 3 6 = 5 7 = 8 8 = 13 9 = 21 10 = 34 11 = 55 12 = 89 13 = 144 14 = 23 15 = 377 16 = 610 17 = 987 18 = 1597 19 = 2584 20 = 4181 21 = 6765 22 = 10946 23 = 17711 24 = 28657 25 = 326 2 8 = 196418 29 = 317811 30 = 514229 ምስል 4 - በ C ++ ውስጥ ድግግሞሽ መፍትሄው ውስብስብ ችግርን ወደ ሁለት ቀላል መፍታት ይመጣል. ለምሳሌ, ከፊቦናቺ ተከታታይ ሶስተኛውን ቁጥር ለማግኘት በመጀመሪያ የመጀመሪያውን እና ሁለተኛውን ማግኘት እና ከዚያ ማከል አለብዎት. የመጀመሪያው ቁጥር ልዩ ጉዳይ ሲሆን ከ 0 (ዜሮ) ጋር እኩል ነው, ሁለተኛው ቁጥር ደግሞ ልዩ ጉዳይ ነው እና ከ 1 ጋር እኩል ነው. ስለዚህ, ከፊቦናቺ ተከታታይ ሶስተኛው ቁጥር ከመጀመሪያው እና ሁለተኛ = ድምር ጋር እኩል ነው. 1. የፊቦናቺ ተከታታይ ቁጥሮችን ለመፈለግ ፕሮግራማችንን ያዘጋጀነው በግምት በተመሳሳይ መንገድ ምክንያት ነው። የጥንታዊውን ችግር የሚፈታ ሌላ ተደጋጋሚ ፕሮግራም እናዳብር - “የሃኖይ ግንብ”። ሦስት ዘንጎች ተሰጥተዋል, በአንደኛው ላይ የ nth የዲስኮች ቁልል አለ, እና ዲስኮች ተመሳሳይ መጠን የሌላቸው (የተለያዩ ዲያሜትሮች ያሉት ዲስኮች) እና ከላይ ወደ ታች በሚንቀሳቀሱበት መንገድ የተደረደሩ ናቸው. በዱላ በኩል, የዲስኮች ዲያሜትር ቀስ በቀስ ይጨምራል. ያም ማለት ትናንሽ ዲስኮች በትልልቅ ዲስኮች ላይ ብቻ መተኛት አለባቸው. ይህንን የዲስክ ቁልል ከመጀመሪያው ዘንግ ወደ ሌላ ሁለት ቀሪዎች መውሰድ ያስፈልግዎታል (ብዙውን ጊዜ ይህ ሦስተኛው ዘንግ ነው)። አንዱን ዘንግ እንደ ረዳት ይጠቀሙ። በአንድ ጊዜ አንድ ዲስክ ብቻ ማንቀሳቀስ ይችላሉ, እና ትልቁ ዲስክ በጭራሽ በትንሹ ዲስክ ላይ መሆን የለበትም. ሶስት ዲስኮች ከመጀመሪያው ዘንግ ወደ ሶስተኛው ማንቀሳቀስ ያስፈልግዎታል እንበል, ይህም ማለት ሁለተኛው ዘንግ ረዳት ነው. ለዚህ ችግር ምስላዊ መፍትሄ በፍላሽ ውስጥ ተተግብሯል. እነማውን ለመጀመር የጀምር አዝራሩን ጠቅ ያድርጉ፣ ለማቆም የማቆሚያ ቁልፍ። ፕሮግራሙ ለ nth የዲስክ ቁጥር መፃፍ አለበት. ይህንን ችግር በተደጋጋሚ የምንፈታው ስለሆነ በመጀመሪያ የመፍትሄውን ልዩ ጉዳዮች መፈለግ አለብን. በዚህ ችግር ውስጥ አንድ ልዩ ጉዳይ ብቻ ነው - ይህ አንድ ዲስክ ብቻ ለማንቀሳቀስ አስፈላጊ በሚሆንበት ጊዜ ነው, እና በዚህ ጉዳይ ላይ ረዳት ዘንግ እንኳን አያስፈልግም, ነገር ግን በቀላሉ ለዚህ ትኩረት አንሰጥም. አሁን የዲስኮች ብዛት ከአንድ በላይ ከሆነ ተደጋጋሚ መፍትሄን ማደራጀት አስፈላጊ ነው. ብዙ ላለመጻፍ አንዳንድ ማስታወሻዎችን እናስተዋውቅ፡- <Б>
- ዲስኮች መጀመሪያ ላይ የሚገኙበት ዘንግ (ቤዝ ዘንግ); በተጨማሪ፣ ችግሩን ለመፍታት አልጎሪዝምን ስንገልጽ፣ እነዚህን ማስታወሻዎች እንጠቀማለን። ሶስት ዲስኮች ከ ለማንቀሳቀስ <Б>
ላይ <Ф>
በመጀመሪያ ሁለቱን ዲስኮች ከ ማንቀሳቀስ ያስፈልገናል <Б>
ላይ <П>
እና ከዚያ ሶስተኛውን ዲስክ (ትልቁን) ወደ <Ф>
, ምክንያቱም <Ф>
ፍርይ ለመንቀሳቀስ nዲስኮች በ <Б>
ላይ <Ф>
መጀመሪያ መንቀሳቀስ አለብን n-1ዲስኮች በ <Б>
ላይ <П>
እና ከዚያ nth ዲስክ (ትልቁን) ወደ ማንቀሳቀስ <Ф>
, ምክንያቱም <Ф>
ፍርይ ከዚህ በኋላ መንቀሳቀስ ያስፈልግዎታል n-1ዲስኮች በ <П>
ላይ <Ф>
, በትሩን በሚጠቀሙበት ጊዜ <Б>
እንደ ረዳት. እነዚህ ሶስት ድርጊቶች ሙሉው ተደጋጋሚ ስልተ ቀመር ናቸው። ተመሳሳዩ ስልተ ቀመር በ pseudocode: // hanoi_tower.cpp፡ የኮንሶል አፕሊኬሽኑን መግቢያ ነጥብ ይገልጻል። // የሃኖይ ግንብ ችግርን በተደጋጋሚ የሚፈታ ፕሮግራም # "stdafx.h"ን ይጨምራል ኮት // ኮድ ኮድ :: ያግዳል ኮት int help_rod; // የረዳት በትር ቁጥር ለመወሰን የማገጃ, የመጀመሪያ እና የመጨረሻ በትር ቁጥሮች በመተንተን ከሆነ (መሰረታዊ_rod! = 2 & & final_rod! = 2) help_rod = 2; ሌላ ከሆነ (መሰረታዊ_rod! = 1 & & final_rod! = 1) help_rod = 1; ሌላ ከሆነ (መሰረታዊ_rod! = 3 & & final_rod! = 3) help_rod = 3;ግንብ (// የሃኖይ ግንብ ችግርን ለመፍታት ተደጋጋሚ ተግባርን ማስጀመር ፣ // መንቀሳቀስ ያለባቸውን የዲስኮች ብዛት ማከማቸት መሰረታዊ_rod ፣ // ዲስኮች መጀመሪያ ላይ የሚቀመጡበትን ዘንግ ቁጥር የሚያከማች ተለዋዋጭ። የሚገኝ help_rod , // እንደ ረዳት የመጨረሻ_ሮድ ጥቅም ላይ የሚውለውን የዱላውን ቁጥር የሚያከማች ተለዋዋጭ); // ዲስኮች መንቀሳቀስ ያለባቸውን የዱላውን ቁጥር ማከማቸት ተለዋዋጭ መመለስ 0; ባዶ ማማ (int count_disk ፣ int baza ፣ int help_baza ፣ int new_baza) (ከሆነ (የቁጥር_ዲስክ == 1) // ተደጋጋሚ ጥሪዎችን የማቆም ሁኔታ (cout) ምስል 5 የሃኖይ ግንብ ሪከርሲቭ ፕሮግራም ምሳሌ ያሳያል። በመጀመሪያ, ከሶስት ጋር እኩል የሆነ የዲስክ ቁጥር አስገባን, ከዚያም ወደ መሰረታዊ ዘንግ (መጀመሪያ) አስገባን እና የመጨረሻውን ዘንግ (ሦስተኛውን) ሾመን. በራስ-ሰር ሁለተኛው ዘንግ ረዳት ሆነ. ፕሮግራሙ ለዚህ ችግር ከአኒሜሽን መፍትሄ ጋር ሙሉ በሙሉ የሚስማማ ውጤት አስገኝቷል። በ C++ ውስጥ ብዙ የመድገም ምሳሌዎች በሚኖሩበት አንድ ትልቅ ጽሑፍ ላለመጻፍ ፣ እዚህ አንድ ተጨማሪ የድግግሞሽ ምሳሌ እጽፋለሁ። በአጠቃላይ, መሰረቱን የተረዱ እና በተግባራቸው ውስጥ ቀጥተኛ ድግግሞሽን የሚጠቀሙ ሰዎች ይህንን ቁሳቁስ መዝለል ይችላሉ. በ C++ ውስጥ ለጀማሪዎች ተግባራት በጽሁፉ ላይ እንደተገለጸው ድግግሞሽን የመጠቀም ምሳሌ እዚህ አለ። መደጋገም ችግር 1 - ድግግሞሽን በመጠቀም የቁጥር ፋክተርን ከ 1 እስከ ኤን ያሳዩ #ያካትቱ #ያካትቱ #ያካትቱ int ዋና() ጌች (); ባዶ ፕሮግራም ተፈጥሯል, አስተያየት መስጠት አያስፈልግም ብዬ አስባለሁ #ያካትቱ #ያካትቱ #ያካትቱ //የእኛ ተደጋጋሚ ተግባር //0! = 1፣ 1!=1፣ 2!=2፣ 3!=6... ምክንያቱም የመጀመሪያዎቹ 2 ቁጥሮች አንድ ናቸው እና በጥብቅ ቅደም ተከተል ውስጥ አይደሉም ፣ ይህንን ነጥብ በኮዱ ውስጥ እናስገድዳለን። n ከሆነ<2
return 1
;
int ዋና() በ C ++ ተደጋጋሚ ፕሮግራም ውስጥ ዋናው ቁራጭ የእኛ ተግባር የቀደመውን ዋጋ ለማግኘት እንደገና ይሰላል። ትክክለኛው እሴት የሚተላለፈው መለኪያ ነው። nከተግባር ጥሪው ነጥብ. ተግባራችንን የምንጠራበት ነጥብ ከፕሮግራሙ ዋና ብሎክ መደወል ነው። በእኛ ሁኔታ, ከተግባር እንጠራዋለን int ዋና() ፕሮግራመሮች ለእንዲህ ያለ የተፋለሰ ፍርድ ይቅር በሉኝ። ጀማሪዎች ተደጋጋሚነትን የሚገነዘቡት ይህ በግምት ነው። ይህ የC++ ብሎግ ለጀማሪዎች ለአንድ ሰው ጠቃሚ ነበር እናም አንድ ሰው በC++ ውስጥ ያለውን የተደጋጋሚነት ተግባር መሰረታዊ ፅንሰ-ሀሳብ እንዲረዳ እንደረዳው ተስፋ አደርጋለሁ። ማስታወሻ. በዚህ ጽሑፍ ውስጥ, ልክ እንደ ቀድሞው, ስሌቱን ከ 1 ወደ N ሳይሆን በፕሮግራሙ ውስጥ የገባውን እሴት አደረግሁ. ነጥቡ ተጨማሪ የኮድ መስመር መጻፍ አልፈለኩም እና ተጠቃሚው አስቀድሞ መረጃን በማስገባት እና በማያ ገጹ ላይ ለማሳየት ጠንቅቆ ያውቃል ብዬ አስቤ ነበር.
ሰላም ሀበራብር! በዚህ ጽሑፍ ውስጥ ስለ ተደጋጋሚ ችግሮች እና እንዴት እንደሚፈቱ እንነጋገራለን. በፕሮግራም አወጣጥ ውስጥ, ድግግሞሽ ከተግባሮች ጋር በቅርበት ይዛመዳል, በፕሮግራም ውስጥ ያሉ ተግባራት ምስጋና ይግባቸውና እንደ ድግግሞሽ ወይም ተደጋጋሚ ተግባር አለ. በቀላል አነጋገር፣ ተደጋጋሚነት የአንድ ተግባር (ዘዴ) አካል በራሱ ፍቺ ነው፣ ማለትም፣ ራሱን የሚጠራ ተግባር ነው፣ በቀጥታ (በአካሉ ውስጥ) ወይም በተዘዋዋሪ (በሌላ ተግባር)። ስለ ተደጋጋሚነት ብዙ ተብሏል። አንዳንድ ጥሩ ሀብቶች እነኚሁና: ከአውታረ መረቡ በድግግሞሽ መልክ የተተገበረ ማንኛውም አልጎሪዝም በድግግሞሽ መልክ እና በተቃራኒው እንደገና ሊፃፍ ይችላል. ይህ አስፈላጊ መሆኑን እና ምን ያህል ውጤታማ እንደሚሆን ጥያቄው ይቀራል. ይህንን ለማስረዳት የሚከተሉት መከራከሪያዎች ሊሰጡ ይችላሉ። ለመጀመር ፣ የመድገም እና የመድገም ትርጓሜዎችን ማስታወስ እንችላለን። ተደጋጋሚነት (Recursion) አንድ ፕሮግራም በቀጥታ ወይም በሌሎች ፕሮግራሞች በመታገዝ ራሱን የሚጠራበት የመረጃ ማቀናበሪያ መንገድ ነው። መደጋገም አንዳንድ ድርጊቶች ወደ ተደጋጋሚ የፕሮግራም ጥሪዎች ሳይመሩ ብዙ ጊዜ የሚደጋገሙበት የውሂብ ሂደት የማደራጀት መንገድ ነው። ከዚያ በኋላ እርስ በርስ የሚለዋወጡ ናቸው ብለን መደምደም እንችላለን, ነገር ግን ሁልጊዜ በሀብቶች እና በፍጥነት ተመሳሳይ ወጪዎች አይደሉም. ይህንን ለማረጋገጥ, የሚከተለውን ምሳሌ ልንሰጥ እንችላለን-አንድ የተወሰነ ስልተ-ቀመር ለማደራጀት, በቆጣሪው ወቅታዊ ዋጋ ላይ በመመርኮዝ የእርምጃዎችን ቅደም ተከተል የሚያከናውን አንድ ተግባር አለ (በዚህ ላይ የተመካ ላይሆን ይችላል). እሱ)። ዑደት ስላለ ሰውነት ተከታታይ ድርጊቶችን ይደግማል ማለት ነው - የዑደት ድግግሞሾች። ክዋኔዎችን ወደ የተለየ ንዑስ-ንዑሳን ክፍል መውሰድ እና ካለ የቆጣሪውን ዋጋ ማለፍ ይችላሉ። የንዑስ ክፍሉን አፈፃፀም ከጨረስን በኋላ ዑደቱን ለማስኬድ ሁኔታዎችን እናረጋግጣለን, እና እውነት ከሆነ, ወደ ንዑስ ክፍል አዲስ ጥሪ እንቀጥላለን, አፈፃፀምን እንጨርሳለን. ምክንያቱም ሁሉንም የሉፕ ይዘቶች በንዑስ ክፍል ውስጥ እናስቀምጣለን ፣ ይህ ማለት ዑደቱን የማስፈፀም ሁኔታ በንዑስ ክፍል ውስጥም ይቀመጣል ፣ እና በተግባሩ መመለሻ እሴት በኩል ሊገኝ ይችላል ፣ መለኪያዎች በማጣቀሻ ወይም ጠቋሚ ወደ ንዑስ ክፍል ይተላለፋሉ። , እንዲሁም ዓለም አቀፍ ተለዋዋጮች. በተጨማሪም፣ ከሉፕ ወደ ተሰጠ ንዑስ-ንዑስ-ሥርዓት ጥሪ በቀላሉ ወደ ጥሪ ወይም ጥሪ (እሴት መመለስ ወይም በቀላሉ ሥራን ማጠናቀቅ) በአንዳንድ ሁኔታዎች በመመራት ወደ ንዑስ ንዑስ ክፍል በቀላሉ እንደሚቀየር ለማሳየት ቀላል ነው። ቀደም ሲል በ loop ሁኔታ ውስጥ ነበሩ). አሁን፣ የአብስትራክት ፕሮግራማችንን ከተመለከቱ፣ በግምት እሴቶችን ወደ ንዑስ ክፍል ማስተላለፍ እና እነሱን መጠቀም ይመስላል፣ ይህም ሲጠናቀቅ ንዑስ ክፍሉ ይለወጣል፣ ማለትም። የተሰጠውን ስልተ ቀመር ለመፍታት ተደጋጋሚ ምልክቱን ወደ ንዑስ ክፍል ተደጋጋሚ ጥሪ ተክተናል። ተደጋጋሚነትን ወደ ተደጋጋሚ አቀራረብ የማምጣት ተግባር የተመጣጠነ ነው። ለማጠቃለል ያህል, የሚከተሉትን ሀሳቦች መግለጽ እንችላለን-ለእያንዳንዱ አቀራረብ የራሱ የሆነ የሥራ ምድብ አለ, ይህም ለአንድ የተወሰነ ተግባር በተወሰኑ መስፈርቶች ይወሰናል. ስለዚህ ጉዳይ የበለጠ ማወቅ ይችላሉ ስለዚህ የተደጋጋሚነት ተግባር ያካትታል የህዝብ ክፍል መፍትሄ (የህዝብ የማይንቀሳቀስ int recursion (int n) (// የመውጫ ሁኔታ // የመሠረት ጉዳይ // ድጋሚ መደጋገሙን መቼ ማቆም እንዳለበት? recursion (n - 1) * n; ) ህዝባዊ የማይንቀሳቀስ ባዶ ዋና (ሕብረቁምፊ አርግስ) (System.out.println (ድግግሞሽ (5)); // ተደጋጋሚ ተግባር ይደውሉ )) እዚህ መሰረታዊ ሁኔታው በ n=1 ጊዜ ነው. ያንን 1!=1 ስለምናውቅ እና 1 ለማስላት! ምንም ነገር አያስፈልገንም. ለማስላት 2! 1 ን መጠቀም እንችላለን, ማለትም. 2!=1!*2። ለማስላት 3! 2 ያስፈልገናል!*3... n ለማስላት! ያስፈልገናል (n-1)!*n. ይህ የመድገም ደረጃ ነው። በሌላ አገላለጽ የቁጥር n የፋይል እሴት ለማግኘት የቀደመውን ቁጥር የፋይል እሴት በ n ማባዛት በቂ ነው. መለያዎች
<П>
- ረዳት ወይም መካከለኛ ዘንግ;
<Ф>
- የመጨረሻው ዘንግ - ዲስኮች የሚንቀሳቀሱበት ዘንግ.
n-1መንቀሳቀስ ወደ <П>
nመንቀሳቀስ ወደ <Ф>
n-1ከ ተንቀሳቀስ <П>
ላይ <Ф>
, በሚጠቀሙበት ጊዜ <Б>
እንደ ረዳት
ኮድ መጻፍ
=============================
ደረጃ ቁጥር 1 ባዶ ፕሮግራም ይጻፉ
=============================
{
ስርዓት ("cls");
መመለስ 0;
}
ደረጃ ቁጥር 2 እኛ የምንጽፈው የድግግሞሹን ተግባር ራሱ እንጽፋለን
=========================================
ኢንት እውነታ (int N)
{
ሌላ ተመለስ n * እውነታ (n-1)
// እዚህ ተግባሩ እራሱን ይጠራል
}
{
ስርዓት ("cls");
ኮት<
ጌች ();
መመለስ 0;
}
ዲ.ዲ
============
መመለስ n * እውነታ (n-1)
የሚቀጥለውን ሳይሆን የቀደመውን ለምን እጽፋለሁ? ቁጥሮች ሲበዙ በመጀመሪያ 0 * 1 የእኛ የአሁኑ ዋጋ 1 ነው, እና ዜሮ የቀደመ ስሌት ዋጋ ነው. ይህ የመድገም አጠቃላይ ይዘት ነው, የአሁኑን ዋጋ ቀዳሚውን በመጠቀም እናሰላለን, የቀደመው ዋጋ በተመሳሳይ ስሌት ይገኛል. ማጠናቀቂያው ራሱ የቀደመውን ዋጋ ያሰላል እና ይህንን እሴት በማህደረ ትውስታ ውስጥ ያከማቻል። እኛ ማድረግ ያለብን መመሪያ መስጠት ብቻ ነው።
. ለዚህ የአቀናባሪዎች ባህሪ ምስጋና ይግባውና አንድ ተግባር እራሱን ለመጥራት መመሪያ ሲያጋጥመው (በእኛ ሁኔታ እውነታ (n-1)
) የተላለፈውን መለኪያ አይደግፍም nተግባሩን ለማስላት. መለኪያው አልፏል nበማስታወስ ውስጥ ይኖራል. በዚህ ሁኔታ, ሌላ የማስታወሻ ቦታ በተጨማሪነት ይገለጻል, ይህም የእኛ ተደጋጋሚ ተግባራቶች የቀደመውን ውጤት ለማግኘት ተደጋጋሚ ስሌቶችን ያከናውናል.ስለ ተደጋጋሚነት በአጭሩ
ተደጋጋሚነት በሳይንስ መስክ ብቻ ሳይሆን በዕለት ተዕለት ሕይወት ውስጥ የሚከሰት በጣም የተለመደ ክስተት ነው። ለምሳሌ፣ Droste effect፣ Sierpinski triangle፣ ወዘተ. ተደጋጋሚነትን የምናይበት አንዱ መንገድ ዌብ ካሜራውን በኮምፒዩተር መከታተያ ስክሪን ላይ ማመላከት ነው፣ በተፈጥሮ፣ በመጀመሪያ በማብራት። ስለዚህ, ካሜራው የኮምፒዩተር ስክሪን ምስልን ይመዘግባል እና በዚህ ስክሪን ላይ ያሳየዋል, ልክ እንደ ዝግ ዑደት ያለ ነገር ይሆናል. በውጤቱም, ከዋሻው ጋር ተመሳሳይ የሆነ ነገር እናስተውላለን.
አንባቢው በንድፈ ሃሳቡ ስለ ተደጋጋሚነት ጠንቅቆ ያውቃል እና ምን እንደሆነ ያውቃል ተብሎ ይታሰባል። በዚህ ጽሑፍ ውስጥ ለተደጋጋሚ ችግሮች የበለጠ ትኩረት እንሰጣለን. ተግባራት
ድግግሞሽን በሚማርበት ጊዜ ተደጋጋሚነትን ለመረዳት በጣም ውጤታማው መንገድ ችግሮችን መፍታት ነው። የተደጋጋሚነት ችግሮችን እንዴት መፍታት ይቻላል?
በመጀመሪያ ደረጃ, መደጋገም ከመጠን በላይ መጨፍጨፍ አይነት መሆኑን መረዳት ያስፈልግዎታል. በጥቅሉ አነጋገር፣ በድግግሞሽ የሚፈታው ነገር ሁሉ በተደጋጋሚ ሊፈታ ይችላል፣ ማለትም፣ ተደጋጋሚ ተግባርን በመጠቀም።
ልክ እንደ ቆጠራ (ዑደት)፣ መደጋገም የማቆም ሁኔታ ሊኖረው ይገባል - የመሠረት ጉዳይ (አለበለዚያ ልክ እንደ ዑደት ፣ ድግግሞሽ ለዘላለም ይሠራል - ማለቂያ የለውም)። ይህ ሁኔታ ተደጋጋሚነት (የተደጋጋሚነት ደረጃ) የሚሄድበት ሁኔታ ነው. በእያንዳንዱ እርምጃ የሚቀጥለው ጥሪ የመነሻውን ሁኔታ እስኪያነሳ ድረስ እና ድጋሚው እስኪቆም ድረስ (ወይም ይልቁንስ ወደ መጨረሻው ተግባር ጥሪ እስኪመለስ ድረስ) ተደጋጋሚ ተግባር ይባላል። አጠቃላይ መፍትሔው ዋናውን ጉዳይ ለመፍታት ነው. ውስብስብ ችግርን ለመፍታት ተደጋጋሚ ተግባር በተጠራበት ጊዜ (የመሠረቱ ጉዳይ ሳይሆን) ችግሩን ወደ ቀላል ለመቀነስ ብዙ ተደጋጋሚ ጥሪዎች ወይም እርምጃዎች ይከናወናሉ። እናም መሰረታዊ መፍትሄ እስክናገኝ ድረስ።
ፋብሪካውን የማግኘት ምሳሌ በመጠቀም ይህንን እንመልከት፡-
መለያዎችን ያክሉ