私は現在、多くの再帰呼び出しを扱うサイドプロジェクトに取り組んでいます。私はコンピュータ科学者ではないので、自分のコードをどのように最適化するかは正確にはわかりません。再帰関数はあまり効率的ではないと私は知っていますが、あなたはしばしばそれを末尾呼び出しで置き換えることができると聞いてきましたが、私はこれをどうやって行うのか正確にはわかりません。この関数は、appendList、sequence、およびusedの3つの配列を取ります。他の引数base、length、index、last wordは整数です。再帰関数の最適化
function Recursion(appendList, base, length, sequence, used, lastWord, index)
#Global variables:
global G_Seq_List
global G_Seq_Index
used = ones(UInt8, 1, base^length)
used[1] = 0
if index == base^length
check = zeros(UInt8, base^length, 1)
for i = 1 : base^length
index = 1
for j = 1 : length
k = mod(i+j-1,base^length)
index = index + base^(length - j)*sequence[k+1]
end
check[index] = check[index] + 1
if check[index] != 1
return
end
end
G_Seq_List[G_Seq_Index,:] = sequence[:]
G_Seq_Index = G_Seq_Index + 1
return
end
#Builds Sequence
for i = 1 : base^length
if appendList[i , mod(lastWord - 1, base^(length - 1)) + 1] == 1
if used[i] == 1
tempUsed = used
tempUsed[i] = 0
tempCounter = index + 1
tempSequence = sequence
tempSequence[tempCounter] = mod(i - 1, base)
Recursion(appendList, base, length, tempSequence, tempUsed, i, tempCounter)
end
end
end
end
この再帰をテールコールに変えるのは簡単な修正ですか?そうでない場合は、この機能を最適化するためにどのようなことができますか?
この機能で達成しようとしていることについても説明できますか?また、最適化を行う最初のステップは、*なぜ*最適化したいのかを知ることです。それは遅いですか?典型的な入力サイズは何ですか? – justhalf