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 فبونیکی نمبرز حاصل کرنے کا کام ہے۔-
کیس 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]; }
ہمیں صرف array arr[0] کا پہلا عنصر تبدیل کرنے کی ضرورت تھی: 0 سے 1 تک۔ اس کے مطابق، پہلے 10 عناصر ہوں گے:
1 1 2 3 5 8 13 21 34 55
سٹریم کے ذریعے پہلے n فبونیکی نمبرز
لیکن ہم اپنی سطح دکھانا چاہتے ہیں۔ تو آئیے دیکھتے ہیں کہ یہ حل استعمال کرنے سے کیسا نظر آئے گا 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));
Stream کلاس کا static iterate طریقہ ایک لامحدود ترتیب شدہ سلسلہ واپس کرتا ہے جو فنکشن کو ابتدائی array arr پر لاگو کرکے تخلیق کیا گیا ہے۔ ہمارے معاملے میں، فنکشن یہ ہے کہ ہر نئی صف کو کمپوز کرنے کے لیے اصول مقرر کیا جائے، جو پچھلے ایک کی بنیاد پر ہے۔ نتیجے کے طور پر، ہمیں صفوں کا ایک سلسلہ ملے گا:
{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}
دراصل، نتائج وہی ہوں گے جو پچھلی مثال میں تھے۔
فبونیکی نمبروں کا مجموعہ
کیا ہوگا اگر ہم سے کہا جائے کہ فبونیکی نمبرز کا مجموعہ نویں عنصر تک شامل کیا جائے؟ اس سے ہمیں کوئی مشکل نہیں ہونی چاہیے۔ آئیے ایک اسٹریم کے ساتھ حل لیں اور forEach کو کچھ دوسرے طریقوں سے تبدیل کریں:-
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