Fibonacchi seriyasidagi ushbu kodda 5 ta nashrni chop etgandan so'ng rekursiya qanday to'xtatiladi?

class FibR
{
   int c=0;
   void fib(int i,int j,int n){
     if(c==n) return;
     System.out.print(i+" "+j+" ");
     int t=j;
     i=i+j;
     j=i+t;
     c++;
     fib(i,j,n);     
   }

   public static void main(String[] args) {
       FibR f=new FibR();
       f.fib(0,1,5);
    }
}

Chiqish quyidagicha:

0 1 1 2 3 5 8 13 21 34

Faqat 0 1 1 2 3, ya'ni , 5 atamani chop etishim kerak Ijobiy holatga qanday tuzatish kiritish kerak? Kod c ++ o'rniga c + = 2 ishlatildi, lekin kod cheksiz pastadir ichiga kiradi. Oldindan rahmat

2
5 raqamini 3 raqamli indeksingizni kamaytiring va siz juftlikda chop etishni unutmang, shuning uchun sizning chiqishingiz 0 1 1 2 3 5
qo'shib qo'ydi muallif Giancarlo Benítez, manba
Aslida c + = 2 ni bajarishingiz mumkin va if (c> = n) ga o'zgartirishingiz mumkin. Siz ikkita qiymatni vaqti-vaqti bilan chop qilmoqdasiz, shu sababli ushbu ikki qiymat joriy kodingizga binoan 5 * 2 marta bosib chiqariladi
qo'shib qo'ydi muallif ShayHaned, manba

6 javoblar

In each of your fib call, you print two fib numbers:System.out.print(i+" "+j+" ");

Quyida sodda versiya mavjud:

public class FibR {
void fib(int i, int j, int n) {
    if (n == 0) return;
    System.out.println(i);
    fib(j, i + j, n - 1);
}

public static void main(String[] args) {
    FibR f = new FibR();
    f.fib(0, 1, 5);
}
}

fib deb ataganingizda, eng so'nggi ikki raqamni ( i va j ) va qancha raqamni bosib chiqarishni qoldirasiz ( n ).

6
qo'shib qo'ydi

c + = 2 dan foydalanish uchun siz if-statement da tenglikni qo'shishingiz kerak.

class FibR
{
   int c = 0 ;
   void fib(int i, int j, int n){
     if (c >= n) return;
     System.out.print(i+" " + j +" ");
     int t = j;
     i += j;
     j = i + t;
     c += 2;
     fib(i, j, n);     
   }

   public static void main(String[] args) {
       FibR f = new FibR();
       f.fib(0, 1, 5);
       System.out.println();
    }
}

Siz faqat 5 ta belgidan foydalana olmaysiz, natijada quyidagilar bo'ladi:

0 1 1 2 3 5
4
qo'shib qo'ydi

Siz ikkalasini ham i va j ni birgalikda chop qilayotganingizda, 5 ta shartni chop qila olmaysiz. Bu 4 yoki 6 bo'lishi mumkin.

Now, as far as infinite loop is concerned, if you are changing c++ to c+=2 then you need to change if (c == n) to if (c >= n) as c will be greater than 5 after 2nd iteration.

3
qo'shib qo'ydi

Hisoblagichni 3 ga qadar qisqartiring va agar iteratingiz hisoblagichga etib ketsa -1 faqat i ni bosing va j tugmalarini bosing

class FibR {
    int c = 0;

    void fib(int i, int j, int n) {
        if (c == n) return;
        if (c < n - 1)
            System.out.print(i + " " + j + " ");
        else
            System.out.print(i);//c == n-1 => just print i

        int t = j;i = i + j;j = i + t;c++;fib(i, j, n);
    }

    public static void main(String[] args) {
        FibR f = new FibR();
        f.fib(0, 1, 3);//reduce to 3
    }
}
2
qo'shib qo'ydi
Ha, to'g'ri! Buni nima uchun qildim bilmayman. Kod yangilandi. Rahmat!
qo'shib qo'ydi muallif Jérôme, manba
int c = 0 dan statik int c = 0 kodini o'zgartirish orqali siz u kabi narsalarni boshlaganda, Fibr f = yangi FibR (), boshqa = yangi FibR (); f.fib (0,1,3); boshqa.fib (0,1,3) . Yigit yig'lab yubordi :)
qo'shib qo'ydi muallif ShayHaned, manba
Sizni tezda tahrir qilganingiz uchun xursand bo'ldim :)
qo'shib qo'ydi muallif ShayHaned, manba
Muammo yo'q :)
qo'shib qo'ydi muallif ShayHaned, manba

Nimaga bunday vazifani yozasiz? O'z-o'zidan ravshanki, sizning funktsiyangiz faqat bitta parametrni, kerakli elementlar sonini oladi.

Siz 3 ta argumentlardan foydalanganingizda murakkabroqdir.

0
qo'shib qo'ydi

O'z-o'zidan ravshanki funktsiyani saqlab qololmaysiz/ayrim tashqi holatlarga bog'liq. Va sizning namunaviy kodingizda siz har bir qo'ng'iroqda ikkita shartni chop etganligingiz, shuning uchun siz uni hech qachon raqamli raqamlarni chiqarib olmaysiz.

0
qo'shib qo'ydi
javobingizni kod yordamida tushuntirib beradigan bo'lsangiz, bu foydali bo'ladi
qo'shib qo'ydi muallif IsuruAb, manba