View Full Version : فیبوناچی با استفاده از lambda
ehsan_faal
جمعه 24 بهمن 1393, 18:32 عصر
سلام. من میخواستم دنباله فیبوناچی رو مثلا اگه بشه با این قابلیت های جدید جاوا 8 یه جور قشنگتر بنویسم. کد زیر رو هم نوشتم نمیدونم چرا کار نمیکنه.
اینم بگم تازه جاوا رو شروع کردم پس لطفا اگه خواستید راهنمایی کنید سطح پایین بگید تا متوجه بشم.
اول یه رنج اعداد صحیح درست کردم که مثلا بگم تا جمله شماره فلان از سری:
List<Integer> list = IntStream.range(1, 11).boxed().collect(Collectors.toList());
بعد هم کد زیر :
list.stream().forEach(p -> {
List<Integer> Fib = new ArrayList<>();
if (p == 1 | p == 2) {
Fib.add(p);
System.out.println(Fib.get(p-1));
} else {
Fib.add(Fib.get(p-2)+Fib.get(p-3));
System.out.println(Fib.get(p-1));
}
});
با تشکر
ehsan_faal
جمعه 24 بهمن 1393, 18:34 عصر
میدونم مشکلم تو قسمتیه که هی میاد یه شی جدید به عنوان لیست میسازه اما اگه لیست رو بیرون از lambda تعریف کنم هم که دیگه نمیتونم تغییرش بدم،
حالا باید چیکار کنم به نظرتون؟
محمد فدوی
شنبه 25 بهمن 1393, 03:00 صبح
من کدت رو اجرا نکردم ولی سهتا مشکل توش واضحه.
شیء Fib هردفعه که عبارت لاندا اجرا میشه از اول ساخته میشه و در حقیقت از عدد سه به بعد خالیه! باید بیرون از لاندا بسازیش.
برای عملگر OR منطقی هم باید از || استفاده کنی.
توی دنبالهی فیبوناچی جملهی اول و دوم هردو یک هستن ولی وقتی شما خود p رو توی خط چهارم میای توی لیست اضافه میکنی کاری میکنی که جملهی اول یک و جملهی دوم دو بشه.
بهرحال من کدت رو اینجوری اصلاح کردم:
List<Integer> list = IntStream.range(0, 10).boxed().collect(Collectors.toList()$
final List<Integer> fib = new ArrayList<>();
list.forEach(p -> {
int newNum;
if (p == 0 || p == 1) {
newNum = 1
} else {
newNum = fib.get(p - 1) + fib.get(p - 2);
}
fib.add(newNum);
System.out.println(newNum);
});
اگه دوست داری بازم بیشتر از قابلیتهای جاوا ۸ استفاده کنی:
List<Integer> list = IntStream.range(0, 10).boxed().collect(Collectors.toList()$
final List<Integer> fib = new ArrayList<>();
list.forEach(p -> {
if (p == 0 || p == 1) {
fib.add(1);
} else {
fib.add(fib.get(p - 1) + fib.get(p - 2));
}
fib.add(newNum);
});
fib.forEach(System.out::println);
البته من اصلا کدت رو اجرا نکردم اگه بازم اجرا نشد بگو تا بازم بررسیش کنم.
موفق باشی.
ehsan_faal
شنبه 25 بهمن 1393, 09:52 صبح
ممنون کد شما درسته.من الان دو تا ابهام دارم ، تا اونجایی که من خوندم چیزی که خارج از لاندا تعریف بشه رو نمیشه توی لاندا تغییرش داد و دوم اینکه چرا فاینال؟
یعنی اگه قراره هی تغییر کنه پس دیگه چه فاینالیه؟
من چند وقت پیش هم راجع به فاینال کردن آرایه ها همین سوالو پرسیدم، اگه امکانش هست یه بار واسه همیشه یه توضیح توپ بدید تا ابهامم رفع بشه.
با تشکر
ahmad.mo74
شنبه 25 بهمن 1393, 13:09 عصر
http://java.dzone.com/articles/do-it-java-8-recursive-and
http://java.dzone.com/articles/memoized-fibonacci-numbers
http://codereview.stackexchange.com/questions/42473/project-euler-even-fibonacci-numbers-in-java-8
http://stackoverflow.com/questions/26288818/infinite-fibonacci-sequence-with-memoized-in-java-8
http://stackoverflow.com/questions/27592379/local-variables-referenced-from-a-lambda-expression-must-be-final-or-effectively
http://stackoverflow.com/questions/20938095/difference-between-final-and-effectively-final
reza_noei
شنبه 25 بهمن 1393, 18:07 عصر
با استفاده از فرمول زیر میتونید مستقیما nامین عدد فیبوناچی رو پیدا کنید :
(1/sqrt(5)) ( ( (1+sqrt(5))/2 )^n - ( (1-sqrt(5))/2 )^n )
عدد اول رو صفر گرفتم.
البته اگه تونستید بخونید (:
ehsan_faal
شنبه 25 بهمن 1393, 18:56 عصر
توی این فرمول از نسبت طلایی استفاده کردین، درسته؟
راه با حالیه، چون نسبت دو جمله آخر توی این دنباله همین عدد 1.6 هستش.
فقط مطمئنید که با افزایش تعداد جملات هم درست جواب میده؟ چون تا جایی که من تست کردم قسمت اعشاری این عدد تموم نمیشه
reza_noei
یک شنبه 26 بهمن 1393, 20:34 عصر
توی این فرمول از نسبت طلایی استفاده کردین، درسته؟
راه با حالیه، چون نسبت دو جمله آخر توی این دنباله همین عدد 1.6 هستش.
فقط مطمئنید که با افزایش تعداد جملات هم درست جواب میده؟ چون تا جایی که من تست کردم قسمت اعشاری این عدد تموم نمیشه
اگه دقت کرده باشید عبارت روبرو ( (1-sqrt(5))/2 )^n قسمت اعشاری رو از عبارت قبل از خودش حذف میکنه و نیازی به نگرانی نیست.
این روش برای پیدا کردن جمله عمومی دنباله های بازگشتی درجه 2 تا 3 کاربرد داره و تو درس ریاضیات گسسته مطرح میشه.
مطمئن باشید جواب میده (:
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.