30/09/2018, 21:09

Đệ quy có được sử dụng vòng lặp?

Chào mọi người! mọi người cho em hỏi 1 chút ạ, khi đề bài yêu cầu ta phải làm gì đó dùng đệ quy thì trong hàm đệ quy mình có được dùng vòng lặp không ạ?

Được chứ
Cơ bản thì nếu “hàm gọi lại chính nó” thì được gọi là đệ quy rồi ko liên quan đến vòng lặp

Nguyễn Hồng Hải viết 23:21 ngày 30/09/2018

ừ mình cũng nghĩ vậy nhưng mà 1 số chỗ chưa chắc lắm, bạn xem cái code này của mình liệt kê số nguyên tố nhỏ hơn n dùng đệ quy thế này có đc không? cái hàm recursion đó

#include "stdio.h"
#include "math.h"

void input(int *n) {
    scanf("%d", n);
}

void byLoop(int n) {
    int i, k;
    for(; n >= 2; n--) {
        k = 1;
        for(i = 2; i <= sqrt(n); i++) {
            if(n == 1 || n == 0) {
                k = 0;
                break;
            }
            if(n == 2) {
                break;
            }
            if(n % i == 0) {
                k = 0;
                break;
            }
        }
        if(k == 1) {
            printf("%d ", n);
        }
    }
}

int byRecursion(int n) {
    int i, k;
    if(n == 2) {
        printf("2\n");
    }
    else {
        k = 1;
        for(i = 2; i <= sqrt(n); i++) {
            if (n % i == 0) {
                k = 0;
                return byRecursion(n-1);
            }
        }
        if(k == 1) {
            printf("%d ", n);
            return byRecursion(n-1);
        }
    }
    return 0;
}

int main() {
    int n, a;
    do {
        printf("MOI BAN CHON: \n");
        printf("================================\n");
        printf("1. Enter a number\n");
        printf("2. Print a prime number by loop\n");
        printf("3. Print a prime number by recursion\n");
        printf("4. Exit\n");
        scanf("%d", &a);
        switch(a) {
            case 1:
                printf("Enter a number: ");
                input(&n);
                break;
            case 2:
                printf("Print a prime number by loop: \n");
                byLoop(n);
                break;
            case 3:
                printf("Print a prime number by recursion: \n");
                byRecursion(n);
                break;
            case 4:
                exit(0);
                break;
        }
    }
    while(a != 4);
}

Nếu đề bài chỉ nói liệt kê số nguyên tố nhỏ hơn n sử dụng đệ quy, thì theo mình ko cần phải làm dài dòng thế này đâu
Chỉ cần 1 hàm xác định số nguyên tố rồi in ra thôi

void TimSoNguyenTo(int n)
{
      if( n == 2)
           cout << n;
      else
      {
          int flag = 0;
          for(int i = n - 1; i > 1; i--)
               if(n % i == 0)
                     flag = 1;
          if(flag == 0)
                cout << n;
          TimSoNguyenTo(n - 1);
      }
}
Nguyễn Hồng Hải viết 23:14 ngày 30/09/2018

Không ý mình là bài yêu cầu dùng đệ quy thì mình làm đệ quy có vòng lặp thế này có được không tại bạn mình cứ bảo trong hàm đệ quy không được có vòng lặp?

Tất nhiên là được rồi bạn
Đệ quy chỉ là “hàm gọi chính nó”, thế nên bạn cứ yên tâm sài đi

Nguyễn Hồng Hải viết 23:26 ngày 30/09/2018

Ok tks bạn

Bài liên quan
0