【发布时间】:2015-05-19 04:23:25
【问题描述】:
这是我的 C 代码:
void combinationComputer(int* temp, int* arr, int* data, int start, int end,
int index, int k, int* x, int* y, int count) {
int i;
if (index == k) {
if (count > k) {
*x = *x + k;
*y = *y + k;
}
for (i = *x; i < *y; i++)
temp[i] = data[i - *x]; // storing all combinations into temp[] as a
// single chunk, one combination at a time
return;
}
for (i = start; i <= end && end - i + 1 >= k - index; i++) {
data[index] = arr[i]; // each combination is stored in data[], with each
// subsequent combination overwriting the previous
// one.
count = count + 1;
combinationComputer(temp, arr, data, i + 1, end, index + 1, k, x, y,
count); // recursive call
}
}
这个函数的作用与问题不太相关,我只是在返回后卡在 for 循环中。请参阅此 for 循环以递归方式调用该函数。最终 for 循环将不成立,它只会在到达最后一个括号时退出函数。
在 C 语言中,这会自动将控制权返回给组合计算机的父调用,在此 for 循环内。我不确定如何在汇编中实现这一点。在 C 中是否有此行为的特定名称? (是尾调用消除)?
基本上我要问的是当您退出(通过到达最后一个括号)递归调用的函数并返回到父调用时调用的行为是什么。这如何在汇编中实现(请不要代码,只是逻辑)如果您需要更多信息,请询问。
【问题讨论】:
-
到达结尾大括号的
void函数会执行返回,就像您明确地将return;放在那里一样。它与第一个return;完全相同,通常使用ret指令。尾调用消除完全是另外一回事,这里不适用,因为递归调用不在尾部位置。 -
好吧,我不知道。谢谢。将其发布为答案。我会选择它。
-
“将 C […] 函数转换为程序集”——您应该为此使用 C 编译器。
-
检查您的 C 编译器是否有生成汇编源代码的选项(通常是
-S(大写字母“S”))。然后你可以编辑它以提高可读性和调整。