我试图实现一个递归函数并遇到一些困难,会很感激你的想法。例如,让我们尝试创建一个名为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']]]]
这显然不是理想的输出,但是方向正确。还有什么其他方法可以做到这一点?谢谢你的想法。
答案 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) )
而不是追加,因为您将获得大量的符号化对象。