python递归函数调用

时间:2015-05-01 18:39:26

标签: python recursion

我试图实现一个递归函数并遇到一些困难,会很感激你的想法。例如,让我们尝试创建一个名为sliding的函数来执行此操作

sliding("python", 2)
["py", "yt", "th", "ho", "on"]

也就是说,对于所选择的整数,我们沿着字符串滑动,抓取适当长度的子字符串,然后将它们全部返回到列表中。

现在我可以(愚蠢地)尝试递归地定义这个:

def sliding(string,k):
  return s if len(string)==k else [string[:k]].append(sliding(string[1:],k))

这将工作,主要是因为list.append()到位并返回None。所以我的问题是 - 有没有办法做这种递归函数,即使有很多Python方法到位?

这是我迄今为止所做的最好的,

def sliding(s,k):
    if len(s)==k:
        return s
    else:
        temp = [s[:k]]
        temp.append(sliding(s[1:],k) ) 
        return temp

这导致

sliding("python",k=2)
['py', ['yt', ['th', ['ho', 'on']]]]

这显然不是理想的输出,但是方向正确。还有什么其他方法可以做到这一点?谢谢你的想法。

5 个答案:

答案 0 :(得分:5)

使用+运算符获取新的连接列表:

def sliding(s, k):
    if len(s) < k: return []
    else: return [s[:k]] + sliding(s[1:], k)

答案 1 :(得分:3)

没有递归的解决方案,只需slice syntax上的小游戏。

05-02 00:48:21.834  22968-22968/com.syemasoft.shopmanager E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.NullPointerException
            at com.syemasoft.shopmanager.Activity_RePayment$RePaymentAdapter$1.afterTextChanged(Activity_RePayment.java:241)
            at android.widget.TextView.sendAfterTextChanged(TextView.java:7346)
            at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:9017)
            at android.text.SpannableStringBuilder.sendAfterTextChanged(SpannableStringBuilder.java:970)
            at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:497)
            at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:435)
            at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:30)
            at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:674)
            at android.view.inputmethod.BaseInputConnection.commitText(BaseInputConnection.java:198)
            at com.android.internal.widget.EditableInputConnection.commitText(EditableInputConnection.java:185)
            at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:279)
            at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:77)
            at android.os.Handler.dispatchMessage(Handler.java:107)
            at android.os.Looper.loop(Looper.java:194)
            at android.app.ActivityThread.main(ActivityThread.java:5391)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
            at dalvik.system.NativeStart.main(Native Method)

答案 2 :(得分:1)

这个怎么样?

end()

答案 3 :(得分:1)

以下是迭代和递归版本:

def sliding(s, window=2):
    for ind in range(len(s) - (window - 1)):
        yield s[ind:ind+window]


def sliding_recursive(s, window=2, ind=0):
    if ind > len(s) - window:
        return []
    strings = [s[ind: ind+window]] + sliding_recursive(s, window, ind+1)
    return strings


>>> list(sliding('python'))
['py', 'yt', 'th', 'ho', 'on']
>>> list(sliding('python', window=3))
['pyt', 'yth', 'tho', 'hon']

>>> sliding_recursive('python')
['py', 'yt', 'th', 'ho', 'on']
>>> sliding_recursive('python', window=3)
['pyt', 'yth', 'tho', 'hon']

答案 4 :(得分:0)

我建议:

temp.extend(sliding(s[1:],k) ) 

而不是追加,因为您将获得大量的符号化对象。