Rewriting a function that creates combinations of numbers with a fixed sum as a generator

finding all possible combinations of numbers to reach a given sum in java
find all possible combinations of numbers in java
finding all possible combinations of numbers to reach a given sum javascript
java list all possible combinations of an array
generate all possible combinations of a set of characters
c program to generate all possible combinations of a given list of numbers
all unique combinations whose sum equals to k
java program to print all combinations of a 4-digit number

I want to turn a recursive function into a generator in python. Currently, I have this function to create combinations of numbers with a fixed sum,

def combinations_fixed_sum(fixed_sum, length_of_list, lst=[]):
  if length_of_list == 1:
    lst += [fixed_sum]
    print(lst)
  else:
    for i in range(fixed_sum+1):
      combinations_fixed_sum(i, length_of_list-1, lst + [fixed_sum-i])

The print statement is the part, that I want to return to the generator. Is this possible?

You can use yield in return individual result to caller. Recursion can be handled with yield from that will yield all the values from nested generator:

def combinations_fixed_sum(fixed_sum, length_of_list, lst=[]):
  if length_of_list == 1:
    lst += [fixed_sum]
    yield lst
  else:
    for i in range(fixed_sum+1):
      yield from combinations_fixed_sum(i, length_of_list-1, lst + [fixed_sum-i])

print(list(combinations_fixed_sum(4, 2)))

Output:

[[4, 0], [3, 1], [2, 2], [1, 3], [0, 4]]

Note that yield from is only available on Python 3, if you're using Python 2.x you need to yield values individually:

def combinations_fixed_sum(fixed_sum, length_of_list, lst=[]):
  if length_of_list == 1:
    lst += [fixed_sum]
    yield lst
  else:
    for i in range(fixed_sum+1):
      for x in combinations_fixed_sum(i, length_of_list-1, lst + [fixed_sum-i]):
        yield x

Find all combinations that add upto given number, the maximum sum (a+b) for a given input integer N satisfying the given condition Given a positive number, find out all combinations of positive numbers that adds upto that number. The program should print only combinations, not permutations. function findCombinationsUtil( $arr , $index , Writing code in comment? Returning Combinations. Using a numbers table or number-generating CTE, select 0 through 2^n - 1. Using the bit positions containing 1s in these numbers to indicate the presence or absence of the relative members in the combination, and eliminating those that don't have the correct number of values, you should be able to return a result set with all the combinations you desire.

It's possible. The most straight forward way is to replace the print with a yield and then make sure to iterate through the generators returned by all the calls to the recursive function.

def combinations_fixed_sum_chain(fixed_sum, length_of_list, lst=[]):
    if length_of_list == 1:
        lst += [fixed_sum]
        yield lst # 1 element generator
    else:
        for i in range(fixed_sum+1):
            # Iterate through each generator
            for comb in combinations_fixed_sum(i, length_of_list-1, lst + [fixed_sum-i]):
                yield comb

Or you could use itertools.chain.from_iterable to chain all the generators together:

from itertools import chain
def combinations_fixed_sum(fixed_sum, length_of_list, lst=[]):
    if length_of_list == 1:
        lst += [fixed_sum]
        return (lst,)
    return chain.from_iterable(
        combinations_fixed_sum(i, length_of_list-1, lst + [fixed_sum-i])
        for i in range(fixed_sum+1))

Print all possible combinations of r elements in a given array of size n, Given an array of size n, generate and print all possible combinations of r elements in When number of elements in data[] becomes equal to r (size of a combination), we print data[]. Like the above method, We create a temporary array data[]. The idea here is similar to Subset Sum Problem. Writing code in comment? To generate random integers between two numbers, you can use the RANDBETWEEN function. In the example shown, the formula in B5 is: = RANDBETWEEN ( 1 , 100 ) This formula is then copied down from B5 to B11. The result is random numbers between 1-100

This is not too difficult to achieve, once we look at the problem a little differently. The first thing to notice is that once n - 1 numbers have been determined, the last number is fixed also, as all numbers together need to sum to some constant. This implies our search space is actually in n - 1 dimensions, rather than the full n.

Why does this matter, you say? Well, this implies we can proceed with normal iteration over this search space, without having to take into account that the numbers must sum to some constant: we can determine the final number ad hoc!

I'll first present the code, and then explain how it works,

import itertools
from collections import deque


def neighbours(node):       # see https://stackoverflow.com/a/45618158/4316405
    for relative_index in itertools.product((0, 1), repeat=len(node)):
        yield tuple(i + i_rel for i, i_rel
                    in zip(node, relative_index))


def combinations(total, numbers):
    nodes = deque([tuple([0] * (numbers - 1))])  # origin
    seen = set()

    while len(nodes) != 0:                       # while not empty
        node = nodes.popleft()

        for neighbour in neighbours(node):
            if neighbour in seen:
                continue

            if sum(neighbour) > total:
                continue                         # should not go out-of-bounds

            nodes.append(neighbour)

            seen.add(neighbour)

            yield [*neighbour, total - sum(neighbour)]

Here we walk along an (n - 1)-dimensional grid, starting at the origin and walking around to visit neighbouring grid points (keeping track of those we have seen before). These new grid points are then visited, and the final entry is determined as well. We keep adding grid points, so long as their indices do not sum to a value larger than total. Once we have exhausted all such admissible grid points, we are done iterating.

Return all combinations, Identify numbers in sum using Excel solver Select cell range E3:I23; Click in fomula bar; Enter custom function; Press and hold CTRL Did you know that Excel can calculate the number of combinations for you? Create permutations [​UDF] Hi Oscar, I need help with trying to create a number generator that has specific  1. Select 6 adjacent cells, such as A1:F1, and then click the Kutools > Insert > Insert Random Data. 2. Now the Insert Random Data dialog box comes out. Go to the Integer tab, type 1 in From box, type 49 in To box, check the Unique values option, and click the OK button.

Umphred's Neurological Rehabilitation, Distributed function presupposes that a single center or neural network has more task and as a pattern generator or oscillator to maintain the activity in another task. be understood by the adage “the whole is greater than the sum of its parts​. of Freedom Combinations of muscle and joint action permit a large number of​  Number Combinations. Combinations. Generate combinations from a range or generate permutations of only selected numbers. Lottery number combination generator lets you generate multiple random combinations of your own lucky lottery numbers.

Functional Programming HOWTO, In Python you might combine the two approaches by writing functions that take Debugging is simplified because functions are generally small and clearly specified. As you work on a functional-style program, you'll write a number of functions Inside a generator function, return value causes StopIteration(value) to be  The function recalculates and produces a new random number every time anyone makes a change to the worksheet, including actions such as adding new data. Any formula that depends either directly or indirectly on a cell containing a volatile function also recalculates every time someone makes a change in the worksheet.

Combinatorics, The function n_choose_m calculates (nm), defined as the number of ways in which This function returns a generator that produces all m-way ordered combinations The total number of combinations generated is given by the called an integer partition, is a way of writing n as a sum of positive integers. When number of elements in data[] become equal to r (size of a combination), we print it. This method is mainly based on Pascal’s Identity , i.e. n c r = n-1 c r + n-1 c r-1 Following is implementation of method 2.

Comments
  • using mutable default argument may cause undesired behavior