برنامه نویسی

درک بازگشت: تماس های عملکردی در داخل یک حلقه

قسمت 2 پیوند
الگو: پیوند
بازگشت یک تکنیک قدرتمند است که در آن یک عملکرد برای حل یک مشکل خود را فرا می خواند. در بسیاری از مشکلات ، تماس های بازگشتی اتفاق می افتد داخل یک حلقه، به ما این امکان را می دهد تا مسیرها ، جابجایی ها و ترکیبات مختلف را کشف کنیم. این مقاله مشکلات کلیدی را در کجا پوشش می دهد تماس های عملکرد در داخل یک حلقه اتفاق می افتد، همراه با اجرای دقیق جاوا.


1. مبلغ ترکیبی (فراخوانی عملکرد در حلقه)

مشکل: تمام ترکیبات منحصر به فرد از اعداد را پیدا کنید که به یک هدف معین خلاصه می شود. عناصر را می توان چندین بار استفاده کرد.

کد:

public static void combinationSum(int[] candidates, int target, int start, List<Integer> temp, List<List<Integer>> result) {
    if (target == 0) {
        result.add(new ArrayList<>(temp));
        return;
    }
    for (int i = start; i < candidates.length; i++) { // Loop through elements
        if (target >= candidates[i]) {
            temp.add(candidates[i]);
            combinationSum(candidates, target - candidates[i], i, temp, result); // Recursive call inside loop
            temp.remove(temp.size() - 1);
        }
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


2. همه زیر مجموعه ها (مجموعه برق) – بدون تماس با عملکرد در حلقه

مشکل: با استفاده از بازگشت ، کلیه زیر مجموعه ها (مجموعه برق) را تولید کنید.

کد:

public static void allSubsets(int[] nums, int index, List<Integer> temp, List<List<Integer>> result) {
    if (index == nums.length) {
        result.add(new ArrayList<>(temp));
        return;
    }
    temp.add(nums[index]);
    allSubsets(nums, index + 1, temp, result);
    temp.remove(temp.size() - 1);
    allSubsets(nums, index + 1, temp, result);
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


3. مبلغ زیر مجموعه – بدون تماس عملکردی در حلقه

مشکل: تمام مبلغ زیر مجموعه ممکن را محاسبه کنید.

کد:

public static void subsetSum(int[] nums, int index, int sum, List<Integer> result) {
    if (index == nums.length) {
        result.add(sum);
        return;
    }
    subsetSum(nums, index + 1, sum + nums[index], result);
    subsetSum(nums, index + 1, sum, result);
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


4. زیر مجموعه های منحصر به فرد – بدون تماس با عملکرد در حلقه

مشکل: همه زیر مجموعه های منحصر به فرد را تولید کنید.

کد:

public static void uniqueSubsets(int[] nums, int index, List<Integer> temp, Set<List<Integer>> result) {
    if (index == nums.length) {
        result.add(new ArrayList<>(temp));
        return;
    }
    temp.add(nums[index]);
    uniqueSubsets(nums, index + 1, temp, result);
    temp.remove(temp.size() - 1);
    uniqueSubsets(nums, index + 1, temp, result);
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


5. مبلغ زیر مجموعه منحصر به فرد – بدون تماس با عملکرد در حلقه

مشکل: مبلغ زیر مجموعه منحصر به فرد را محاسبه کنید.

کد:

public static void uniqueSubsetSum(int[] nums, int index, int sum, Set<Integer> result) {
    if (index == nums.length) {
        result.add(sum);
        return;
    }
    uniqueSubsetSum(nums, index + 1, sum + nums[index], result);
    uniqueSubsetSum(nums, index + 1, sum, result);
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


6. کلیه مجوزها (تماس عملکرد در حلقه)

مشکل: تمام مجوزهای یک آرایه معین را تولید کنید.

کد:

public static void allPermutations(int[] nums, List<Integer> temp, boolean[] used, List<List<Integer>> result) {
    if (temp.size() == nums.length) {
        result.add(new ArrayList<>(temp));
        return;
    }
    for (int i = 0; i < nums.length; i++) { // Loop through elements
        if (!used[i]) {
            used[i] = true;
            temp.add(nums[i]);
            allPermutations(nums, temp, used, result); // Recursive call inside loop
            temp.remove(temp.size() - 1);
            used[i] = false;
        }
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


خلاصه

نوع مشکل تماس عملکرد در حلقه؟
مبلغ ترکیبی ✅ بله
همه زیر مجموعه ها ❌ نه
مبلغ ❌ نه
زیر مجموعه های منحصر به فرد ❌ نه
جمع زیر مجموعه منحصر به فرد ❌ نه
همه مجوزها ✅ بله

غذای اصلی:

  • عملکرد تماس در داخل یک حلقه معمولاً در مشکلات درگیر دیده می شوند ترکیبات وت تجویزبشر
  • هیچ تابعی در حلقه ها تماس نمی گیرد به طور معمول برای استفاده می شوند تولید زیر مجموعه یا محاسبات جمعبشر
  • با استفاده از برگشت به عقب با یک حلقه به ما اجازه می دهد تمام نتایج ممکن را کاوش کنید کارآمد

این پست وبلاگ اکنون باید با توضیحات ، قطعه کد و بینش به درستی ساختار یافته باشد. اگر می خواهید اصلاحات بیشتری داشته باشید به من اطلاع دهید! 🚀

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا