Tag: 递归

GCC的尾部呼叫优化有多“聪明”?

我刚刚讨论了以下两个C代码的讨论: for循环: #include #define n (196607) int main() { long loop; int count=0; for (loop=0;loop<n;loop++) { count++; } printf("Result = %d\n",count); return 0; } 递归: #include #define n (196607) long recursive(long loop) { return (loop>0) ? recursive(loop-1)+1: 0; } int main() { long result; result = recursive(n); printf(“Result = %d\n”,result); return 0; } 在看到这段代码时,我看到了recursive(loop-1)+1并认为“啊,这不是尾调用递归”,因为它在完成对recursive的调用之后还有工作要做; 它需要增加返回值。 […]

应该避免在C / C ++中使用递归调用吗?

应该避免在C / C ++中使用函数的递归调用吗? 我从事机器学习/数据挖掘工作,因此让我的代码可扩展至关重要。 当我使用Java时,我尽可能避免使用递归调用,因为我经常让我的调用堆栈溢出。 虽然有控制分配给调用堆栈的内存量的选项,但我认为让我的程序依赖于较少数量的参数是更理想的。 因此,当很清楚如何在没有递归调用的情况下实现,可能使用自己管理的堆栈,我这样做了。 但即使在Java中,我也不确定这是一门正确的学科。 据我所知,C / C ++中没有调用堆栈,所以我不担心溢出它。 因此,我很好奇:在程序的可伸缩性方面,是否会尝试避免使用递归,或者是否鼓励它,或者它是特定于问题的?

错过了使用递归查找总和的逻辑,得到了段错误

我试图实现以下使用recurssion但我得到segfault请纠正我? 我尝试使用集合{1,,3,5,7}的排列解决问题,但未能输出所需的结果打印奇数部分中的数字的所有组成,即对于n = 8:7 + 1 5 + 3 5 + 1 + 1 + 1 3 + 3 + 1 + 1 3 + 1 + 1 + 1 + 1 + 1 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 sumto8(a,start,sum1)是://选择关注元素sumto8(a,start,sum)是://选择关注元素 #include #include int sumto8(int*,int,int); int […]

从输入的字符数组中找到所有可能的单词(排列)

阅读了几篇文章之后,我仍然对排列和递归函数感到难过。 我试图在不等长的2D数组中创建所有可能的3个字母排列,其中第一个字母来自集合{‘l’,’m’,’n’},第二个字母来自集合{‘q ‘,’r’}和第三个字母来自集合{‘a’,’e’,’i’,’o’}。 我的代码经过了正确的排列模式,但没有打印出正确的输出。 例如,如果前8个排列应该是: lqa lqe lqi lqo lra lre lri lro 我的代码打印出来: lqa e i o ra e i o 关于问题是什么的任何想法? 以下是我的代码的相关部分: rec(character_pools,0,3); void rec(char** pool, int k, int j) { if(k==j) { printf(“\n”); return; } int i,len=strlen(pool[k]); for (i=0;i<len;i++) { printf("%c",pool[k][i]); rec(pool,k+1,j); } }

如何手动分析递归源代码?

如何手动分析递归源代码? 例如,我设计了一种手工分析迭代源代码的技术,如下所示: int fact(int n) { int f = 0; int i = 0; if (n<=1) { return 1; } f = 1; i = 2; for (i=2; i<=n ; i++) { f *= i; } return f; } ————————— if new-f ————————— ————————— ————————— 对于每个’i’,我可以手动分析和计算old-f和new-f的值,并填写表格以查看例程是否正常工作。 但是如何手动分析递归例程? int fact(int number) { int temp; if(number <= […]

C中的递归堆栈

在递归期间,会创建一个堆栈,该堆栈包含什么,它包含值还是存储操作数的地址 void recursiveReverse(struct node** head_ref) { struct node* first; struct node* rest; /* empty list */ if (*head_ref == NULL) return; /* suppose first = {1, 2, 3}, rest = {2, 3} */ first = *head_ref; rest = first->next; /* List has only one node */ if (rest == NULL) return; /* reverse the rest […]

使用递归和无循环查找数组中最长的升序子系列的长度

我已经被困了好几个小时试图想象我怎样才能编写一个获取整数和整数数组的函数,并使用递归找到数组中最长的升序子系列的长度而根本没有循环。 我只允许使用另外一个递归函数,例如,对于以下数组:{45,1,21,3,3,6,53,9,18} outpot应该是5,因为最长的子系列是{ 1,3,6,9,18}。 所以,基本上,一个获取数组及其大小的函数,需要打印最长子系列的长度,根本不使用循环,没有全局/静态类型,它可能使用另一个“帮助”递归函数,那就是它。 这几乎就是我提出的所有内容,而且它一团糟,效果不佳。 我正在尝试扫描数组,同时我知道当前正在查看的索引,与当前比较的索引,以及从中启动当前子系列的originla索引。 我试图扫描arrays,同时知道应该比较的索引,但我卡住了,这是我得到的,我真的很感激任何提示和建议。 谢谢。 void max_set(int arr[], int size) { int bigSeries[2] = { 0 }; calcSeries(arr, bigSeries,0, 0, 1, size -1, 1); printf(“number of max parts going up %d \n”, bigSeries[0]); } void calcSeries(int arr[], int bigSeries[],int originalCHeckedIndex, int checkedIndex, int currentIndex, int lastIndex, int ascending) { if ((checkedIndex […]

递归函数的输出不正确,以计算数字的位数之和

我试图编写一个函数来计算使用递归的数字的总和,但输出是不正确的。 这是代码: /*Write a function to calculate sum of digits of a number using recursion*/ /*Author:Udit Gupta Date:10/08/2011*/ #include int sum (int); int main () { int n,s; printf (“Enter the number:”); scanf (“%d”,&n); s = sum (n); printf (“The sum of the digits of the number is %d”,s); } int sum (int a) { […]

可以通过值传递数组到递归函数吗?

我想编写一个递归函数,为问题构建所有可能的解决方案。 我想我应该传递一个数组,然后,在每个递归步骤中,将它设置为该递归步骤中可能的所有值,但后来我开始想知道这是否可行,因为C通过传递指针传递数组。 你通常如何处理这个问题? 我正在考虑这些问题。 根据选择的路径,数组将采用许多不同的值。 我想我们真正想要的是按值传递数组。 recFunc(int* array, int recursiveStep) { for (int i = 0; i < a; i++) { if (stopCondition) { doSomething; } else if (condition) { array[recursiveStep] = i; recFunc(array, recursiveStep+1); } } }

仅打印那些总和为10-C程序的3位数组

输出: 1 2 3 4 1 2 7 1 3 6 1 4 5 1 9 2 3 5 2 8 3 7 4 6 10 预期产出: 1 2 7 1 3 6 1 4 5 2 3 5 我只想要那些总和为10并且也只有3位的数字对,即应该显示总和为10的3个不同数字对,其他所有其他对都跳过或不显示。 下面是我为此问题编写的完整源代码。 #include #include void partition(int part) { int *parts, *ptr, i, idx = 0, tot […]