How to handle return from recursion

Question:

I’m trying to make a polyomino generator of level N. I successfully made a function that connects a tile with a root in every possible way and returns all combinations. Now I need to extend this to level N. I’ve done my best, but still can’t handle recursion the right way.
Here’s my function:

def connect_n(tiles,root,n=1):
    if not isinstance(tiles[0], list): tiles = [tiles]
    result = []
    if n == 1:
        for tile in tiles:
            result += connect(tile, root)
        return result
    else:
        return connect_n(tiles, root,n-1)

This function successfully creates N nested functions and executes base case at n==1. But then with obtained result, it just goes up and up and exits with that result without any other iterations. I’m sure I’m missing something. I tried to move conditions and loops around without success.

I have following input:

root = (0,0)
N = 3 #for example, can be any number > 0

Function connect(root,root) returns:

[[(0, 0), (1, 0)]]

Then functionconnect([[(0, 0), (1, 0)]],root) returns

[[(0, 0), (1, 0), (2, 0), (3, 0)], 
 [(0, 0), (0, 1), (1, 0), (2, 0)], 
 [(0, 0), (0, 1), (1, 0), (1, 1)], 
 [(0, 0), (1, 0), (1, 1), (2, 1)]]

And so on.

Function connect_n output should be

[[(0, 0), (1, 0)]] for N=1
[[(0, 0), (1, 0), (2, 0), (3, 0)],
 [(0, 0), (0, 1), (1, 0), (2, 0)],
 [(0, 0), (0, 1), (1, 0), (1, 1)],
 [(0, 0), (1, 0), (1, 1), (2, 1)]]  for N=2

And so on.

Asked By: Dmitry Arch

||

Answers:

I’m not sure I understand the algorithm, but I think this is what you want:

def connect_n(tiles, root, n=1):
    if n == 1:
        return connect(tiles, root)
    else:
        return connect_n(connect_n(tiles, root, n-1)), root)
Answered By: Barmar
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.