我覺得你在貼代碼的時(shí)候應(yīng)該把縮進(jìn)加上,或者直接把代碼的圖片放上,要好理解的多
我們一直強(qiáng)調(diào)做網(wǎng)站、成都做網(wǎng)站對(duì)于企業(yè)的重要性,如果您也覺得重要,那么就需要我們慎重對(duì)待,選擇一個(gè)安全靠譜的網(wǎng)站建設(shè)公司,企業(yè)網(wǎng)站我們建議是要么不做,要么就做好,讓網(wǎng)站能真正成為企業(yè)發(fā)展過程中的有力推手。專業(yè)的建站公司不一定是大公司,創(chuàng)新互聯(lián)建站作為專業(yè)的網(wǎng)絡(luò)公司選擇我們就是放心。
您好:perm函數(shù)輸出的是參數(shù)list從參數(shù)k位置開始,到參數(shù)m位置結(jié)束的全排列
def perm(list,k,m):
if k==m:
for i in range(m+1): # 遞歸的結(jié)束條件是k==m,在整個(gè)遞歸過程中參數(shù)m(即結(jié)束位置沒有改變),而參數(shù)k則每次遞歸+1
print list[i], # 輸出遞歸結(jié)束時(shí)的list狀態(tài)
else:
for i in range(k,m+1): # 該循環(huán)用來負(fù)責(zé)生成遞歸的下一個(gè)狀態(tài)
list[k],list[i]=list[i],list[k] # 將list的k位置與每一個(gè)位置i分別交換
perm(list,k+1,m) # 由于k位置與每一個(gè)位置i交換,也即k位置所有可能選值都已被窮舉,此時(shí)只需要繼續(xù)計(jì)算k+1之后的職位即可,因此以k+1為開始位置,結(jié)束位置m不變進(jìn)入下一層遞歸
list[k],list[i]=list[i],list[k] # 由于list是引用傳遞,因此需要在位置交換之后重新交換,以保證list不變。
希望我的答復(fù)可以幫助你加深理解:
第一,perm函數(shù)中的條件for(int
i=k;i=m;i++)應(yīng)更正為
for(int
i=k;i
#include
int
N,P=0;
void
swap(int
a[],int
i,int
j)
{
int
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
void
perm(int
a[],int
k,int
m,int
pk,int
pm)
{
int
i;
/*k為中間變量,m初始化為參與排列元素的起始坐標(biāo)和終止坐標(biāo)
pk,pm分別表示參與排列元素的起始坐標(biāo)和終止坐標(biāo),整個(gè)遞歸過程保持不變*/
if(k==m)
{
printf("-----perm
%d
:\n",P/N+1);/*打印提示*/
for(i=pk;i
Over!\n");/*打印提示*/
system("pause");
return
0;
}
2.打印結(jié)果
============================================================
a
0,0,1,2,3
b
0,0,1,2,3
a
1,1,1,2,3
b
1,1,1,2,3
a
2,2,1,2,3
b
2,2,1,2,3
-----perm
1
:
1
2
3
c
2,2,1,2,3
d
2,2,1,2,3
c
1,1,1,2,3
d
1,1,1,2,3
a
2,1,1,2,3
b
2,1,1,3,2
a
2,2,1,3,2
b
2,2,1,3,2
-----perm
2
:
1
3
2
c
2,2,1,3,2
d
2,2,1,3,2
c
2,1,1,3,2
d
2,1,1,2,3
c
0,0,1,2,3
d
0,0,1,2,3
a
1,0,1,2,3
b
1,0,2,1,3
a
1,1,2,1,3
b
1,1,2,1,3
a
2,2,2,1,3
b
2,2,2,1,3
-----perm
3
:
2
1
3
c
2,2,2,1,3
d
2,2,2,1,3
c
1,1,2,1,3
d
1,1,2,1,3
a
2,1,2,1,3
b
2,1,2,3,1
a
2,2,2,3,1
b
2,2,2,3,1
-----perm
4
:
2
3
1
c
2,2,2,3,1
d
2,2,2,3,1
c
2,1,2,3,1
d
2,1,2,1,3
c
1,0,2,1,3
d
1,0,1,2,3
a
2,0,1,2,3
b
2,0,3,2,1
a
1,1,3,2,1
b
1,1,3,2,1
a
2,2,3,2,1
b
2,2,3,2,1
-----perm
5
:
3
2
1
c
2,2,3,2,1
d
2,2,3,2,1
c
1,1,3,2,1
d
1,1,3,2,1
a
2,1,3,2,1
b
2,1,3,1,2
a
2,2,3,1,2
b
2,2,3,1,2
-----perm
6
:
3
1
2
c
2,2,3,1,2
d
2,2,3,1,2
c
2,1,3,1,2
d
2,1,3,2,1
c
2,0,3,2,1
d
2,0,1,2,3
-----Over!
請(qǐng)按任意鍵繼續(xù).
.
.
我不明白的是,為什么會(huì)只能處理10個(gè)以下的x。雖然python有1000次的遞歸次數(shù)上限,但你的問題所需要的遞歸次數(shù)是由x的個(gè)數(shù)決定的,應(yīng)該還遠(yuǎn)沒有達(dá)到遞歸上限。所以,只能認(rèn)為你的寫法是錯(cuò)誤的。
def?f(string):
if?'x'?in?string:
strlist?=?string.split()
strtmp?=?''
for?i?in?range(len(strlist)):
strtmp?+=?strlist[i].replace('x',?'0',?1)
strtmp?+=?'?'
strtmp?+=?strlist[i].replace('x',?'1',?1)
strtmp?+=?'?'
return?f(strtmp.strip())
else:
return?string
a?=?'xxxxxxxxxxx'
print?f(a)
Python實(shí)現(xiàn)的排列組合計(jì)算操作示例
本文實(shí)例講述了Python實(shí)現(xiàn)的排列組合計(jì)算操作。分享給大家供大家參考,具體如下:
1. 調(diào)用 scipy 計(jì)算排列組合的具體數(shù)值
from scipy.special import comb, perm
perm(3, 2)
6.0
comb(3, 2)
3.0
2. 調(diào)用 itertools 獲取排列組合的全部情況數(shù)
from itertools import combinations, permutations
permutations([1, 2, 3], 2)
itertools.permutations at 0x7febfd880fc0
# 可迭代對(duì)象
list(permutations([1, 2, 3], 2))
[(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
list(combinations([1, 2, 3], 2))
[(1, 2), (1, 3), (2, 3)]
def?perm(l):
#定義自定義函數(shù)?函數(shù)名為perm?參數(shù)為l?當(dāng)傳入?yún)?shù)時(shí)?l等于該參數(shù)
if(len(l)=1):??
#if語(yǔ)句如果傳入的參數(shù)l的長(zhǎng)度小于等于1(也就是0)則運(yùn)行下面代碼?否則跳過該if#????#語(yǔ)句
return?[l]
#返回列表[l]?此處為遞歸的終止??
r=[]
#定義列表?并初始化r???
for?i?in?range(len(l)):??
#for循環(huán)(c語(yǔ)言常這么說)?迭代?i的變化范圍為0?到l(字母L)的長(zhǎng)度-1
s=l[:i]+l[i+1:]
#?將l的前三項(xiàng)以及l(fā)的第i+1后的字串賦給s
p=perm(s)??
#遞歸?將s做perm的處理?遞歸請(qǐng)百度
for?x?in?p:
#迭代p列表??
r.append(l[i:i+1]+x)?
#將l的第i項(xiàng)添加進(jìn)r列表?
return?r
#返回r列表
函數(shù)功能:將傳入perm()的字串、列表等參數(shù)進(jìn)行全排列 并返回全排列后的列表
#遞歸不是人的思考方式…