migliorabile ha scritto:
@Weierstrass, tanto per dimostrare chi c'e' l'ha piu' corto
(SI, lo so! Ma si puo' fare lo stesso Pensa bene a come funzionano gli operatori booleani)
int is_ordered(char* s) {
return !(s[0] && s[1]) || (s[0] <= s[1]) && is_ordered(s+1);
}
int is_ordered(char* s) {
return !(*s && *(s+1)) || (*s <= *(s+1)) && is_ordered(s+1);
}
Scritta in questo modo, un buon compilatore la convertirebbe in un ciclo.
Ottimo esempio
Io però rimango sempre dubbioso sui compilatori. Ho provato con due pesi massimi ed in entrambe la stack cresce inesorabilmente
Codice
#include "stdio.h"
int is_ordered(char* s) {
return !(s[0] && s[1]) || (s[0] <= s[1]) && is_ordered(s+1);
}
int main(){
char s[20] = "est";
int a = is_ordered(s);
printf("%d", a);
return 0;
}
IAR, ARM, Optimization High
int is_ordered(char* s) {
is_ordered:
0x1d40: 0xb580 PUSH {R7, LR}
return !(s[0] && s[1]) || (s[0] <= s[1]) && is_ordered(s+1);
0x1d42: 0x7802 LDRB R2, [R0]
0x1d44: 0x2a00 CMP R2, #0
0x1d46: 0xbf1c ITT NE
0x1d48: 0x7841 LDRBNE R1, [R0, #0x1]
0x1d4a: 0x2900 CMPNE R1, #0
0x1d4c: 0xd009 BEQ.N 0x1d62
0x1d4e: 0x4291 CMP R1, R2
0x1d50: 0xd309 BCC.N 0x1d66
0x1d52: 0x1c40 ADDS R0, R0, #1
0x1d54: 0xf7ff 0xfff4 BL is_ordered ; 0x1d40
0x1d58: 0x1e40 SUBS R0, R0, #1
0x1d5a: 0x4180 SBCS R0, R0, R0
0x1d5c: 0x43c0 MVNS R0, R0
0x1d5e: 0x0fc0 LSRS R0, R0, #31
0x1d60: 0xbd02 POP {R1, PC}
0x1d62: 0x2001 MOVS R0, #1
0x1d64: 0xbd02 POP {R1, PC}
0x1d66: 0x2000 MOVS R0, #0
0x1d68: 0xbd02 POP {R1, PC}
0x1d6a: 0x0000 MOVS R0, R0
gcc, x86, Optimization -O3
!int is_ordered(char* s) {
is_ordered+0: push %ebp
is_ordered+1: mov %esp,%ebp
is_ordered+3: sub $0x18,%esp
! return !(s[0] && s[1]) || (s[0] <= s[1]) && is_ordered(s+1);
is_ordered()
is_ordered+6: mov 0x8(%ebp),%eax
is_ordered+9: movzbl (%eax),%eax
is_ordered+12: test %al,%al
is_ordered+14: je 0x4014cb <is_ordered+66>
is_ordered+16: mov 0x8(%ebp),%eax
is_ordered+19: add $0x1,%eax
is_ordered+22: movzbl (%eax),%eax
is_ordered+25: test %al,%al
is_ordered+27: je 0x4014cb <is_ordered+66>
is_ordered+29: mov 0x8(%ebp),%eax
is_ordered+32: movzbl (%eax),%edx
is_ordered+35: mov 0x8(%ebp),%eax
is_ordered+38: add $0x1,%eax
is_ordered+41: movzbl (%eax),%eax
is_ordered+44: cmp %al,%dl
is_ordered+46: jg 0x4014d2 <is_ordered+73>
is_ordered+48: mov 0x8(%ebp),%eax
is_ordered+51: add $0x1,%eax
is_ordered+54: mov %eax,(%esp)
is_ordered+57: call 0x401489 <is_ordered>
is_ordered+62: test %eax,%eax
is_ordered+64: je 0x4014d2 <is_ordered+73>
is_ordered+66: mov $0x1,%eax
is_ordered+71: jmp 0x4014d7 <is_ordered+78>
is_ordered+73: mov $0x0,%eax
!}
is_ordered+78: leave
is_ordered+79: ret
Poi vabbè, sono questioni di lana caprina su un PC o su un qualsiasi processore che non abbia una RAM infima