簡體   English   中英

遞歸程序中的分段錯誤

[英]Segmentation fault in recursive program

我在做硬幣問題,問題說,

給定一組硬幣值coins = {c1, c2,..., ck}和目標金額n ,我們的任務是使用盡可能少的硬幣形成總和n

假設你有 9 美元並且你有一組{6,5,1}所以,最小沒有。 9 美元的總和/零錢將是( 6+1+1+1=9)4

我嘗試使用以下公式遞歸地執行此操作:

solve(x) = min( solve(x−6)+1, solve(x−5)+1, solve(x−1)+1 )

,但我不知道為什么我的代碼中出現分段錯誤。

網上有很多代碼,但我想知道我在這里做錯了什么,我是遞歸新手,請幫助我,代碼在這里:

//my code

#include<bits/stdc++.h>
using namespace std;
int solve (int x, int a[], int n)
{
  if (x < 0)
    {
      return INT_MAX;
    }
  if (x == 0)
    {
      return 0;
    }
  int best = INT_MAX;
  for (int i = 0; i < n; i++)
    {
      best = min (best, solve (x - a[i], a, n) + 1);
    }
  return best;
}

int main ()
{
int a[] = { 6, 5, 1 };
int x = 9;
int n = 3;
cout << solve (x, a, n);
  return 0;
}

代碼取自:

    #include <iostream>
    using namespace std;
    
    int minCoins(int coins[], int m, int amount) {
        if (amount == 0) return 0;

        int res = INT_MAX;

        for (int i = 0; i < m; i++) {
            if (coins[i] <= amount) {
                int sub_res = minCoins(coins, m, amount - coins[i]);

                if (sub_res != INT_MAX && sub_res + 1 < res) { // avoid overflow 
                    res = sub_res + 1;
                }
            }
        }
        return res;
    }

    int main() {
        int coins[] = { 6, 5, 1 };
        int amount = 9;
        cout << "Min coins is " 
             << minCoins(coins, sizeof(coins) / sizeof(coins[0]), amount) 
             << endl;
        return 0;
    }

關於問題:

  1. 您的分段錯誤來自以下行: best = min (best, solve (x - i, a, n) + 1); 原因是: xi總是會給你相同的值,所以如果你在沒有調試的情況下運行程序,你的程序就會崩潰。 所以不要嘗試調試它,因為看到這個崩潰需要很長時間。 對於初學者更改為: best = min (best, solve (x - a[i], a, n) + 1); .

  2. 修復第1節后,if case: if (x < 0) return INT_MAX; 將導致問題並且將始終返回相同的值,即: -INT_MAX 所以你需要再次檢查“if case”。

  3. 您嘗試實現的算法不正確,請參見該算法的偽代碼:

     minchange(M): if M = 0: return 0 v <- infinity for c in denominations <= M: v <- min { minchange(M - c) + 1, v } return v
  4. 更好地使用: sizeof(a) / sizeof(a[0])而不是int n = 3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM