bool palindrome(char arr[],int size){
if(size<=1){
return true;
}
if(*(arr)==*(arr size-1)){
bool small_ans=palindrome(arr 1,size-2);
return small_ans;
}
return false;
}
這段代碼檢查回文的效率如何?
uj5u.com熱心網友回復:
有一種稱為尾遞回的編譯器優化。
在您非常簡單的情況下,編譯器發現有可能使用此優化。結果,它默默地將您的代碼轉換為迭代版本:
https://godbolt.org/z/rsjaYhde6
palindrome(char*, int):
cmp esi, 1
jle .L4
movsx rax, esi
sub esi, 2
shr esi
lea rax, [rdi-1 rax]
lea edx, [rsi 1]
add rdx, rdi
jmp .L3
.L8:
add rdi, 1
sub rax, 1
cmp rdi, rdx
je .L4
.L3:
movzx ecx, BYTE PTR [rax]
cmp BYTE PTR [rdi], cl
je .L8
xor eax, eax
ret
.L4:
mov eax, 1
ret
筆記:
- 代碼中不需要
call實際使用遞回的指令 - label
.L8負責替換遞回的回圈
請記住,存在“假設規則”,因此編譯器可以以多種方式轉換您的代碼以使其更快。
uj5u.com熱心網友回復:
一般來說,遞回解決方案通常比迭代更優雅,但大多需要更多的 CPU 時間和記憶體空間。CPU 必須在每次遞回時將資料放入堆疊。
特別是在這種情況下,迭代似乎在時間和記憶體上更有效。
嘗試這樣的事情:
bool palindrome(char arr[], int size)
{
for (int i = 0; i < size; i) {
if (arr[i] != arr[size-1-i])
return false;
}
return true;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/410798.html
標籤:
上一篇:傳遞庫鏈接中的未定義參考
