递归函数,用于从一组数字中查找生成数字的方式的数目

时间:2018-08-13 10:51:52

标签: php recursion

我进行了一次求职面试,我遇到的问题是创建一个函数,该函数将返回通过使用某个集合中的数字生成数字的方式的数量,并且该集合中的任何数字都可以使用N次。

就像我有10个数字,我想找出使用​​[ 2,3,5 ] 10 种方法>

  1. 2 + 2 + 2 + 2 + 2 = 10
  2. 5 + 3 + 2 = 10
  3. 2 + 2 + 3 + 3 = 10
  4. 5 + 5 = 10

要解决此问题,我做了以下功能:

function getNumberOfWays($money, $coins) {
    static $level = 0;
    if (!$level) {
        sort($coins);
    }

    if ($level && !$money) {
        return 1;
    } elseif (!$level && !$money) {
        return 0;
    }

    if ($money === 1 && array_search(1, $coins) !== false) {
        return 1;
    } elseif ($money === 1 && array_search(1, $coins) === false) {
        return 0;
    }

    $r = 0;
    $tmpCoins = $coins;
    foreach ($coins as $index => $coin) {
        if (!$coin || $coin > $money) {
            continue;
        }

        $tmpCoins[$index] = 0;
        $tmpMoney = $money;
        do {
            $tmpMoney -= $coin;
            if ($tmpMoney >= 0) {
                $level++;
                $r += getNumberOfWays($tmpMoney, $tmpCoins);
                $level--;
            } elseif (!$tmpMoney) {
                $r++;
            }
        } while ($tmpMoney >= 0);
    }

    return $r;
}

此函数可以正常工作并返回正确的值。 我的问题是是否有更好的方法。

谢谢

0 个答案:

没有答案