不用循环的算法可以寻求递归来实现。
对于这个最大整数转为二进制时递归最深,64位64倍固定栈大小?。
itoa将num按radix进制转换字符串到rec_array缓冲区,其中缓冲区未检测。
#include"stdio.h"
#include"string.h"
int trace_counter = 0;
char *trace_array;
char *rec_itoa(int num, char *rec_array, int radix);
char *itoa(int num, char *array, int radix)
{
char *rec_array = array;
trace_array = array; // trace
if (num < 0)
{
num = -num;
*array = '-';
rec_array++;
trace_counter++; // trace
}
else if (num == 0)
*array = 0 - '0';
rec_array = rec_itoa(num, rec_array, radix);
*rec_array = 0;
return array;
}
char *rec_itoa(int num, char *rec_array, int radix)
{
static char array_0_z[] = "0123456789abcdefghijklmnopqrstuvwxyz";
printf("trace num : %d. \n", num);
if (num >= radix)
{
rec_array = rec_itoa(num / radix, rec_array, radix);
num %= radix;
}
*rec_array = array_0_z[num];
printf("trace_%d: updata array[%d] = %c, now array = '%*s'\n", trace_counter, rec_array - trace_array, *rec_array, trace_counter + 1, trace_array); // trace;
trace_counter++; // trace
return ++rec_array;
}
// return buf+1 to change the pointer buf instead of moving it in a recursive char *rec(char **buf, int len); will change buf.
// function.
char *rec(char *buf, int len)
{
if (len)
buf = rec(buf, len - 1);
printf("rec %s\n", buf++);
return buf;
}
void rec_to_change_buf_is_na(char *buf, int len)
{
// codes here are the same to the above but the last line;
}
int main()
{
char buf[100] = "++++++++";
printf("result: %s\n", itoa(244, buf, 2));
char rec_buf[] = "201308021926";
rec(rec_buf, strlen(rec_buf));
//char * p= "abcde";
//int a = (++p)++;
//printf("a = %d\n", a);
int *p[6], (*p2)[4];
int arr[6][4];
printf("\narr = %p, arr[0] = %p\n", arr,arr[0]);
p[0] = arr[0];
p2 = arr;
p2++;
printf("p = %p, p2 = %p\n\n%d\n",p, p2, 2^3);
}
/*
ouptput :
trace num : 244.
trace num : 122.
trace num : 61.
trace num : 30.
trace num : 15.
trace num : 7.
trace num : 3.
trace num : 1.
trace_0: updata array[0] = 1, now array = '1+++++++'
trace_1: updata array[1] = 1, now array = '11++++++'
trace_2: updata array[2] = 1, now array = '111+++++'
trace_3: updata array[3] = 1, now array = '1111++++'
trace_4: updata array[4] = 0, now array = '11110+++'
trace_5: updata array[5] = 1, now array = '111101++'
trace_6: updata array[6] = 0, now
array = '1111010+'
trace_7: updata array[7] = 0, now array = '11110100'
result: 11110100
rec 201308021926
rec 01308021926
rec 1308021926
rec 308021926
rec 08021926
rec 8021926
rec 021926
rec 21926
rec 1926
rec 926
rec 26
rec 6
rec