Tag: 递归

如何包含头文件?

我在工作区中有一个带有* .c和* .h文件的普通C代码。 我有一个头文件1.h声明一些结构为 struct my1 { int a; .. .. }my_t; 但是当我尝试在另一个头文件2.h中声明类型struct my1的变量时,如下所示: – struct my1 variable1; 它在此声明点出错。 在2.h文件中看起来my1未定义。 在文件1.h中我需要包含2.h,因此在文件2.h中我不能包含1.h,因为害怕递归包含。 我的问题是: – 在这种情况下,我需要声明什么才能解决编译错误? 这一切让我想到了有关头文件包含的更多问题。 如何包含头文件,按什么顺序,哪个头文件首先是哪一个? 递归包含头文件会导致错误一个文件包括其他包括其他包括第一个? 由于某些安全原因,无法发布实际的代码片段,如果这个问题在某种程度上会带来一些可读性问题,那就很抱歉。

C中的无限递归

给定C程序无限递归: int main() { main(); return 0; } 为什么会导致堆栈溢出。 我知道这导致C ++中来自以下线程的未定义行为这是无限递归UB吗? (并且作为侧节点,不能在C ++中调用main() )。 但是,valgrind告诉我这会导致堆栈溢出: Stack overflow in thread 1: can’t grow stack to 0x7fe801ff8 最后由于分段错误,程序结束: ==2907== Process terminating with default action of signal 11 (SIGSEGV) ==2907== Access not within mapped region at address 0x7FE801FF0 这也是C中未定义的行为,或者这是否真的导致堆栈溢出,然后为什么会导致堆栈溢出? 编辑 1我想知道C中是否允许无限递归? 2这是否会导致堆栈溢出? (已得到充分回答)

c栈中的递归

这里是在merge merge中进行分区的代码。我无法理解recusrion究竟是如何工作的! MERGE SORT PARTITION void partition(int arr[], int low, int high){ int mid; if(low < high){ mid = (low + high)/2; partition(arr, low, mid); partition(arr, mid + 1, high); mergeSort(arr, low, mid, high); } } 实际上我在很多递归问题中搞砸了,我无法理解系统堆栈如何在递归中工作……我是一个初学者..

C – 删除递归函数中的重复结果

我必须创建一个递归函数,告诉你可以改变一些分数的方式。 (使用四分之一,硬币和硬币)。 到目前为止,我有一个递归function,但它不止一次计算相同的组合,所以数字太大。 如何删除重复的组合? 码: #include //Prototypes int coins(int); int main(void){ //Declarations int num; //Get user input printf(“Enter an amount of change in cents: “); scanf(“%d”, &num); //Change to fgets //Call function printf(“There are %d ways to make change for %d cents.\n”, (coins(num)), num); } int coins(int amt){ //Declarations int ways=0; //Base Case if(amt == […]

每次递归都可以改为迭代吗?

每个递归函数都可以转换为迭代吗? 递归函数应该具有什么特性才能使用迭代实现它? 我一直在尝试使用迭代定义以下函数,但似乎是不行! 它应该探索迷宫中的所有路径(节点)。 任何人都可以使用迭代重写这个吗? 如果不可能,为什么不呢? typedef int[0,99] id_t; bool visited[id_t]; int path[id_t]; int pathCounter = 0; struct { id_t id; bool free; int neighborNode[4]; } nodeMap[id_t]; void findPath(int current){ visited[current] = true; for (i : int[0, 3]){ if(nodeMap[nodeMap[current].neighborNode[i]].free == true && visited[nodeMap[current].neighborNode[i]] == false && nodeMap[current].neighborNode[i] != -1){ path[pathCounter] = nodeMap[nodeMap[current].neighborNode[i]].id; pathCounter++; findPath(nodeMap[current].neighborNode[i]); path[pathCounter] […]

二叉树上的递归删除

我试图理解删除二叉搜索树的递归方法是如何工作的。 我在很多地方遇到的代码如下: void destroy_tree(struct node *leaf) { if( leaf != 0 ) { destroy_tree(leaf->left); destroy_tree(leaf->right); free( leaf ); } } 我无法理解a)如果例程中没有返回,它是如何工作的? b)当free()被调用时? 我想想,例如,这样一棵树: 10 / \ 6 14 / \ / \ 5 8 11 18 所以我的理解是我遍历10-> 6-> 5,然后我调用destroy_tree(5->左)。 因此,leaf if if为NULL,并且if-dependent不执行,因此5不被删除。 我在哪里弄错了这个推理? 如何在这里进行卷绕和展开? 任何帮助都很感激:-)

为什么stackoverflow错误混乱?

这个简单的C程序很少在相同的调用深度终止: #include #include void recursive(unsigned int rec); int main(void) { recursive(1); return 0; } void recursive(unsigned int rec) { printf(“%u\n”, rec); recursive(rec + 1); } 这种混乱行为背后的原因是什么? 我使用fedora(16GiB ram,堆栈大小为8192),并使用cc编译,没有任何选项。 编辑 我知道这个程序会抛出一个stackoverflow 我知道启用一些编译器优化会改变行为,程序将达到整数溢出。 我知道这是未定义的行为,这个问题的目的是理解/获得可能解释我们在那里观察到的实现特定内部行为的概述。 问题更多,因为在Linux上,线程堆栈大小是固定的并由ulimit -s给出,会影响可用的堆栈大小,以便堆栈溢出并不总是出现在相同的调用深度? 编辑2 @BlueMoon总是在他的CentOS上看到相同的输出,而在我的Fedora上,堆栈为8M,我看到不同的输出(最后打印的整数261892或261845,或261826,或……)

如何使用CPP预处理器编写递归for循环“重复”宏来生成C代码?

我想强制预处理器为我做一些自动代码生成。 我不需要太多:只是一个包含另一个for循环的简单for循环。[1] 我已经阅读了所有关于宏观扩展的内容,并且在蓝色涂料出现时不再傻笑。 在美好的一天,我甚至可以解释为什么需要多层宏来生成带有标记粘贴的函数名称。 我实际上已经让for-loop工作了。 但是当把循环放在一个循环中时,我会减少随机地使用DEFER,EVAL和OBSTRUCT并且希望最好。 我不会被理智的召唤吓倒。 我确实想用标准的C预处理器来做这件事。 我保证无论结果如何,我,我的雇主和我的inheritance人都不会因技术弊端而起诉你。 我保证如果没有适当的安全眼镜,我不会允许任何人维护代码,甚至不能查看代码。 如果你愿意,假装我只是在考虑理论上的兴趣。 或者我唯一的另一种选择是使用M4:因为如果CPP中的递归宏是变态的,那么M4肯定是整只鸡。 我发现的最好的参考资料是一个有9年历史的Usenet线程: http : //comp.std.c.narkive.com/5WbJfCof/double-cpp-expansion 它开始偏离主题,在语气方面有些小而且好斗,而且是我的头脑。 但我认为我寻求的答案就在那里。 接下来最好的是一个名为Cloak的CPP滥用标题的文档: https : //github.com/pfultz2/Cloak/wiki/C-Preprocessor-tricks,-tips,-and-idioms 它需要一种不同的迭代方法,或许可以满足我的需求。 但它也是一个很好的概述。 这里有一些简短的代码,以显示我被卡住的地方。 repeat.h: #define REPEAT(macro, times, start_n, next_func, next_arg, macro_args…) \ _REPEAT_ ## times(macro, start_n, next_func, next_arg, ## macro_args) #define REPEAT_ADD_ONE(macro, times, start_n, macro_args… ) \ REPEAT(macro, times, start_n, _REPEAT_ADD_ONE, 0, ## […]

在C中递归地创建和遍历二叉树

我想创建一个二叉树并通过preorder遍历遍历它,我使用递归方法。 这些代码可以编译但无法正确运行,我发现它可能无法完成CreateBitree()函数,但我不知道问题出在哪里。 #include #include typedef struct BiNode{ int data; struct BiNode *lchild; struct BiNode *rchild; //left and right child pointer }BiNode; int CreateBiTree(BiNode *T); int TraverseBiTree(BiNode *T); int main() { BiNode *t; CreateBiTree(t); TraverseBiTree(t); return 0; } int CreateBiTree(BiNode *T) { //create a binary tree by preorder traversal char tmp; scanf(“%c”, &tmp); if(tmp == ‘ […]

递归引起的分段错误

我正在编写一个程序,要取1-10之间的数字,并显示所有可能的方法来安排数字。 防爆输入:3输出: 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 每当我输入9或10时,程序会产生分段错误并转储核心。 我相信问题是我的递归算法被调用了太多次。 有人可以帮助指出我如何限制所需的递归调用量吗? 这是我目前的代码: void rearange(int numbers[11], int index, int num, int fact) { int temp = numbers[index]; numbers[index] = numbers[index-1]; numbers[index-1] = temp; int i; for (i = 1; i 0) // If we […]