0

I am creating a program to figure out the highest number of decimals in a list of numbers. Basically, a list with [123, 1233] would return 4 because 1233 has four numbers in it and it is the largest. Another example would be that [12, 4333, 5, 555555] would return 6 because 555555 has 6 numbers.

Here is my code.

def place(listy):  
    if len(listy) == 1:  
        decimal = len(str(listy[0]))    
        print(decimal)  
    else:  
        if len(str(listy[0])) >= len(str(listy[1])):  
            new_list = listy[0:1]  
            for i in listy[2:]:  
                new_list.append(i)  
            place(new_list)  
        else:   
            place(listy[1:]) 

Now, when I use print(decimal) it works, but if I change print(decimal) to return decimal, it doesn't return anything. Why is this? How do I fix this? I have come across these return statements which doing run a lot of times. Thanks in advance!

4

5 に答える 5

8

再帰呼び出しを行う場合 (つまり、placeがplaceを呼び出し、呼び出された placeが値を返す場合、呼び出し元のplaceもそれを返す必要があります (つまり、戻り値が最初の呼び出し元に「バブルアップ」します)。

したがって、すべての再帰呼び出しを置き換える必要があります

place(...)

return place(...)

他の人が言ったように、max() を使用するなど、より簡単な解決策があります。再帰的なアプローチを維持したい場合は、次のようにコードをリファクタリングします。

def place2(listy):
    if len(listy) < 1:
        return None
    elif len(listy) == 1:
        return len(str(listy[0]))
    else:
        v0, v1 = listy[0], listy[1]
        if v1 > v0:
            return place2(listy[1:])
        else:
            return place2([listy[0]]+listy[2:])

これは末尾再帰ですが、Python はあまり気にしないので、このアプローチは非効率的です。max() を使用するか、ループを使用することが、Python でのより良い解決策になります。

于 2013-03-22T18:52:41.823 に答える
1

It's not that the return doesn't do anything, it's that you don't propagate the return from your recursive call. You need a few more returns:

def place(listy):  
    if len(listy) == 1:  
        decimal = len(str(listy[0]))    
        return decimal
    else:  
        if len(str(listy[0])) >= len(str(listy[1])):  
            new_list = listy[0:1]  
            for i in listy[2:]:  
                new_list.append(i)  
            return place(new_list)  # <-- return added
        else:   
            return place(listy[1:]) # <-- return added

You can see the print at any level, but to get it back to the caller it needs to be propagated.

于 2013-03-22T18:50:46.090 に答える
0

整数のリストの最大長を見つけることだけが必要な場合は、次のことを検討してください。

max([len(str(n)) for n in N])

例えば

N = [1,22,333,4444]
max([len(str(n)) for n in N]) # Returns 4

N = [12, 4333, 5, 555555]
max([len(str(n)) for n in N]) # Returns 6

注: これは正の整数に対してのみ機能します。

またはもっと簡単に:

len(str(max(N)))

これも正の整数に対してのみ機能します。

于 2013-03-22T18:51:20.983 に答える
-2

関数の外部で定義された変数にアクセスして変更するには、「グローバル変数」(google it) を使用します。

于 2014-05-28T09:06:02.113 に答える