F = {0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...}
F 0 = 0, F 1 = 1, F n = F n - 1 + F n - 2 ؛
n ≥ 0، n ∈ Z
جاوا ۾ پهريون فبونيڪي نمبر حاصل ڪرڻ
فرض ڪريو اسان وٽ پهريون n Fibonacci نمبر حاصل ڪرڻ جو ڪم آهي.-
ڪيس 0.1:
هڪ خاص نمبر n اسان وٽ اچي ٿو:
int[] arr = new int[n]; arr[0] = 0; arr[1] = 1; for (int i = 2; i < arr.length; ++i) { arr[i] = arr[i - 1] + arr[i - 2]; }
اسان سائيز n جي هڪ صف ٺاهيندا آهيون. پهريان ٻه عنصر صفر ۽ هڪ جي برابر هوندا، ۽ باقي عنصر حاصل ڪيا ويندا هن لوپ ذريعي وڃڻ سان ۽ صفن مان پوئين انگن کي استعمال ڪندي.
۽ اسان ڏيکاريون ٿا:
for (int i = 0; i < arr.length; ++i) { System.out.println(arr[i]); }
سيٽ int n = 10;
۽ اسان حاصل ڪريون ٿا:
0 1 1 2 3 5 8 13 21 34
-
ڪيس 1.1 لاءِ حل اصل ۾ مختلف ناهي:
int[] arr = new int[n]; arr[0] = 1; arr[1] = 1; for (int i = 2; i < arr.length; ++i) { arr[i] = arr[i - 1] + arr[i - 2]; }
اسان کي صرف تبديل ڪرڻ جي ضرورت هئي صف آري جو پهريون عنصر [0]: 0 کان 1 تائين. ان جي مطابق، پهرين 10 عنصر هوندا:
1 1 2 3 5 8 13 21 34 55
پهريون n Fibonacci نمبر وهڪرو ذريعي
پر اسان پنهنجي سطح کي ڏيکارڻ چاهيون ٿا. سو اچو ته ڏسون ته هي حل stream استعمال ڪرڻ جهڙو نظر ايندو .-
0.1 لاءِ:
Stream.iterate(new int[]{0, 1}, arr -> new int[]{arr[1], arr[0]+ arr[1]}) .limit(n) .map(y -> y[0]) .forEach(x -> System.out.println(x));
اسٽريم ڪلاس جو جامد ورجائي طريقو هڪ لامحدود آرڊر ٿيل وهڪرو واپس ڪري ٿو جيڪو فنڪشن کي لاڳو ڪندي ابتدائي صف آرر تي لاڳو ڪري ٿو. اسان جي حالت ۾، فنڪشن هر نئين صف کي ترتيب ڏيڻ لاء قاعدو مقرر ڪرڻ آهي، پوئين هڪ جي بنياد تي. نتيجي طور، اسان صفن جو سلسلو حاصل ڪنداسين:
{0,1} {1,1} {1, 2} {2, 3} {3, 5} {5, 8} {8, 13} {13, 21} {21, 34} {34, 55} …..
پر اتي انھن جو لامحدود تعداد ھوندو، ۽ تنھنڪري .limit(n) استعمال ڪندي اسان عنصرن جو تعداد گھٽ ڪريون ٿا پھريون n (اسان جي صورت ۾ 10 تائين).
تنهن هوندي، اسان کي صفن جي اسٽريم جي ضرورت ناهي، تنهنڪري .map(y -> y[0]) استعمال ڪندي اسان هر صف جو پهريون عنصر چونڊيو ۽ نمبرن سان هڪ وهڪرو حاصل ڪريون جيڪي اسان کي گهربل آهن ۽ ان کي استعمال ڪندي ڪنسول ڏانهن پرنٽ ڪريو forEach. .
وڌيڪ ٿڌو لڳندو آهي، ڇا اهو ناهي؟
پهرين عنصرن سان گڏ 1,1 هي ڪوڊ به لڳ ڀڳ ساڳيو هوندو:Stream.iterate(new int[]{1, 1}, arr -> new int[]{arr[1], arr[0]+ arr[1]}) .limit(n) .map(y -> y[0]) .forEach(x -> System.out.println(x));
ٻيهر، اختلاف ابتدائي عنصر ۾ آهن: بدران {0, 1} اسان سيٽ ڪيو {1, 1}
دراصل، نتيجا ساڳيا ئي هوندا جيئن اڳئين مثال ۾.
Fibonacci انگن جو مجموعو
ڇا جيڪڏهن اسان کي فبونيڪي نمبرن جو مجموعو حاصل ڪرڻ لاءِ چيو ويو ته nth عنصر تائين شامل آهي؟ اهو اسان کي ڪنهن به مشڪلات جو سبب نه هجڻ گهرجي. اچو ته هڪ وهڪرو سان هڪ حل وٺو ۽ هر هڪ کي ٻين طريقن سان تبديل ڪريو:-
0.1 لاءِ:
int n = 10; int result = Stream.iterate(new int[]{0, 1}, arr -> new int[]{arr[1], arr[0]+ arr[1]}) .limit(n) .map(t -> t[0]) .mapToInt(Integer::intValue) .sum(); System.out.println(result);
.mapToInt(Integer::intValue) استعمال ڪندي اسان پنھنجي اسٽريم کي عددي IntStream ۾ تبديل ڪريون ٿا ۽ ان جو .sum() طريقو استعمال ڪري سڀني عنصرن جو مجموعو حاصل ڪريون ٿا.
- 1,1 ابتدائي عنصرن جي صورت ۾، اسان {0, 1} جي بدران سيٽ ڪيو {1, 1}.
فبونيڪي سيريز ۾ نمبر نمبر حاصل ڪرڻ
ڪڏهن ڪڏهن توهان کي پرنٽ ڪرڻ لاءِ چيو ويندو آهي انگن جو سلسلو نه، پر خاص طور تي فبونيڪي سيريز ۾ نمبر نمبر. ضابطي جي طور تي، اهو صرف ڪم کي آسان بڻائي ٿو، ڇاڪاڻ ته توهان آساني سان هن لاء اڳوڻي حل کي ترتيب ڏئي سگهو ٿا. خير، ٻيهر ورجائي ذريعي مسئلو حل ڪرڻ بابت ڇا؟-
0.1 لاءِ:
public int getFibonacciValue(int n) { if (n <= 1) { return 0; } else if (n == 2) { return 1; } else { return getFibonacciValue(n - 1) + getFibonacciValue(n - 2); } }
الورورٿم کي 0,1 سان هلائڻ لاءِ، اهو بيان ڪرڻ ضروري آهي ته جڏهن اسان پهريون عنصر حاصل ڪرڻ جي ڪوشش ڪندا آهيون، ته اسان کي 0، ۽ ٻيو - 1 ملندو. حقيقت ۾، اسان کي، اڳئين حلن ۾، پهرين ٻن کي ترتيب ڏيڻ جي ضرورت آهي. عناصر.
-
1.1 تي عمل درآمد ٿورڙو مختلف ٿيندو:
public int getFibonacciValue(int n) { if (n == 0) { return 0; } else if (n == 1) { return 1; } else { return getFibonacciValue(n - 1) + getFibonacciValue(n - 2); } }
انهي حالت ۾، اسان کي صرف پهرين عنصر کي 1 طور مقرر ڪرڻ جي ضرورت آهي، ڇو ته ٻيو عنصر ساڳيو هوندو، ۽ طريقي جو جواب ساڳيو هوندو.
ساڳئي وقت، اسان طريقي جي رد عمل کي 0 تي سيٽ ڪيو، ڇاڪاڻ ته جيڪڏهن اسان ان کي مقرر نه ڪندا آهيون، پوء جڏهن 2 هڪ دليل جي طور تي اچي ٿو، ساڳئي طريقي کي ٻيهر سڏيو ويندو آهي، پر دليل 0 سان. اڳتي هلي، ساڳيو طريقو شروع ڪيو ويندو. ، پر منفي انگن سان، ۽ ائين ئي منفي لامحدوديت تائين. نتيجي طور، اسان حاصل ڪنداسين StackOverflowError .
GO TO FULL VERSION