30/09/2018, 18:22

Cách chạy của hàm for trong chương trình này là như thế nào?

public static void duyet(int i) {
    for (int j=0; j<4; j++) {
        x[i]=a[j];
        if(i==k-1)
            check(x,k);
        else duyet(i+1);
    }
}
viết 20:38 ngày 30/09/2018

Mình thấy mỗi đệ quy, hàm duyet() có sử dụng lời gọi hàm tới chính nó.

Bạn nên đưa code cũng như đề bài thì mọi người mới giải thích được chứ.

Phạm Việt Khanh viết 20:35 ngày 30/09/2018

mình mới học java nên bạn xem r giải thích giúp mình cái nhưng mình k hiểu chính là cái đệ quy đó bạn
bài toán cho 4 số 0 1 2 5 lập số có k số có tổng bằng N

import java.util.Scanner;
public class Lietke {
    private static int x[]=new int[30];
    private  static int a[]={0,1,2,5};
    private static int k,n;

    public static void check(int a[],int k)
    {
        int sum=0;
        for(int i=0;i<k;i++)
            sum=sum+x[i];
        if(sum==n&&x[0]!=0)
        {
            for(int i=0;i<k;i++)
                System.out.print(x[i]);
            System.out.println();
        }

    }
    public static void duyet(int i)
    {
        for (int j=0;j<4;j++)
        {
            x[i]=a[j];
            if(i==k-1)
                check(x,k);
            else duyet(i+1);
        }

    }
    public  static void main(String [] args)
    {
        Scanner in=new Scanner(System.in);
        System.out.println("nhap gia tri n");
        n=in.nextInt();
        System.out.println("nhap gia tri k");
        k=in.nextInt();
        duyet(0);
    }
}
viết 20:33 ngày 30/09/2018

Trích một cách giải thích tìm thấy trên mạng chứ mình cũng k biết nói sao nữa :

Một hàm được gọi là đệ quy nếu bên trong thân nó có một lời gọi đến chính nó. Trong thực tế, một hàm đệ quy luôn có điều kiện dừng được gọi là “điểm neo”. Khi đạt tới điểm neo, hàm sẽ không gọi chính nó nữa.

Khi được gọi, hàm đệ quy thường được truyền cho một tham số, thường là kích thước của bài toán lớn ban đầu. Sau mỗi lời gọi đệ quy, tham số sẽ nhỏ dần, nhằm phản ánh bài toán đã nhỏ hơn và đơn giản hơn. Khi tham số đạt tới một giá trị cực tiểu (tại điểm neo), hàm sẽ chấm dứt.

Bạn có thể google để tìm hiểu về đệ quy, làm một só bài tập như tính giai thừa, số fibonaci… để hiểu rõ hơn.

Phạm Việt Khanh viết 20:24 ngày 30/09/2018

cái đó mình cx đã tìm hiểu nhưng mình đang thắc mắc cách chạy của vòng for.

public static void duyet(int i)
{
    for (int j=0;j<4;j++)
    {
        x[i]=a[j];
        if(i==k-1)
            check(x,k);
        else duyet(i+1);
    }
}

lúc đầu i=0 ->vòng for thì x[0]=a[0] lệnh if kiểm tra i==k-1 k cái thì gọi lại hàm nhưng với i=1;
mình nghĩ thì hàm này chạy cứ sinh ra x[0]=a[0],x[1]=a[0],…x[k-1]=a[0] à??

viết 20:35 ngày 30/09/2018

Hàm đệ quy này còn ở trong for nữa mà bạn. Mở đầu hàm duyet(i) phải chạy 4 lần j (j = 0 -> j < 4), nếu không thoả mãn điều kiện, sẽ đệ quy hàm duyet(i+1) và lại chạy lại 4 lần j … cứ như thế tới khi nào i == k - 1. Để hiểu được giải thuật này mình nghĩ khá là khó, thôi thì ng.ta làm như thế thì mình cũng biết thế vậy.

X.lỗi vì không giúp được gì nhiều.

Phạm Việt Khanh viết 20:38 ngày 30/09/2018

mình cảm ơn…mình cx vừa hiểu ra vấn đề

Kieu Xuan Dong viết 20:38 ngày 30/09/2018

cái này ứng dụng của thuật toán đệ quy , mình thấy khá giống backtrack bạn thử tìm hiểu xem

viết 20:23 ngày 30/09/2018

Mình học toán rời rạc về thuật toán quay lui có dùng đệ quy kết hợp với for. Tuỳ từng bài tập thì thay đổi tham số truyền vào để giải chứ để hiểu kĩ thì cũng khá là khó.

Có a.chị nào đã đi làm cho e hỏi là sau này lập trình có l.quan tới đệ quy phức tạp k ạ ?

Mai Anh Dũng viết 20:33 ngày 30/09/2018

Không sử dụng nhiều đệ quy đâu, trừ phi không có giải pháp khác hoặc đệ quy với số lần lặp nhỏ thì mới dùng. Vì đệ quy có nguy cơ overflow.

Bài liên quan
0