user-0 提问: 我的这个递归哪里错了

回复:
user: user-1
content: 引用 10 楼 zhao4zhong1 的回复:“给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出+1

user: user-2
content: #include <stdio.h> #include <stdlib.h> int xp(char s[],int l,int y) { int i; if(l==0) return y; for(i=0;i<l/2;i++)     if(s[i]!=s[l-i-1])         return y; y+=1; xp(s,l/2,y); } int main() {     char s[]={"ABBA"};     int l;     l=strlen(s);     printf("%d",xp(s,l,0));     return 0; }

user: user-3
content: 引用 13 楼 myzts 的回复:#include <stdio.h> #include <stdlib.h> int dc(char s[]) { 	int length=strlen(s),t,i; 	for (i=0;i<length/2;i++) 	{ 		if(s[i]!=s[length-i-1]) 			return 0; 	}     t=1;     return (t+dc(s[length/2])); } int main() { 	char s[]={"ABBA"};     printf("%d",dc(s)); 	system("pause"); 	return 0; }  return (t+dc(&s[length/2]));//这里添加取地址符  我这边修改后运行的结果为

user: user-3
content: 引用 17 楼 myzts 的回复:[quote=引用 6 楼 u011337306 的回复:] [quote=引用 5 楼 u011337306 的回复:] [quote=引用 3 楼 myzts 的回复:] [quote=引用 1 楼 u011337306 的回复:] 这简单的东西就得自己去调试了，又不是什么复杂的算法，把那些参数都可以输出来看看！ 新手,调试了的,对递归不熟悉,需要指导...[/quote] 给你个例子参考：  int  f(int n) { 	int sum=0; 	if(n==0)  return 1; 	else 	return 2*f(n-1); }  void main() { 	int sum =0; 	sum	= f(10); 	printf("%d\n",sum);   // 结果1024 = 2^10 } //递归过程：先递归求出上一个值：f(10)-->f(9)-->...--->f(0)  = 1 //然后：再依次求出f(10)：f(0) ---->>   f(1)-->f(2)-->...--->f(10) = 1024  不知道说清楚没？先动手，实在不行，我们再帮你！学习是自己的事情，动手多加调试信息才是硬道理！[/quote]上面f函数多打了一行，int sum = 0，多余。。[/quote]  太谢谢你了,这是我想要的结果,可是为什么要添加这个&[/quote] 因为你的dc函数，传递的是形参是地址

user: user-0
content: 引用 6 楼 u011337306 的回复:[quote=引用 5 楼 u011337306 的回复:] [quote=引用 3 楼 myzts 的回复:] [quote=引用 1 楼 u011337306 的回复:] 这简单的东西就得自己去调试了，又不是什么复杂的算法，把那些参数都可以输出来看看！ 新手,调试了的,对递归不熟悉,需要指导...[/quote] 给你个例子参考：  int  f(int n) { 	int sum=0; 	if(n==0)  return 1; 	else 	return 2*f(n-1); }  void main() { 	int sum =0; 	sum	= f(10); 	printf("%d\n",sum);   // 结果1024 = 2^10 } //递归过程：先递归求出上一个值：f(10)-->f(9)-->...--->f(0)  = 1 //然后：再依次求出f(10)：f(0) ---->>   f(1)-->f(2)-->...--->f(10) = 1024  不知道说清楚没？先动手，实在不行，我们再帮你！学习是自己的事情，动手多加调试信息才是硬道理！[/quote]上面f函数多打了一行，int sum = 0，多余。。[/quote]  太谢谢你了,这是我想要的结果,可是为什么要添加这个&

user: user-0
content: 引用 13 楼 myzts 的回复:#include <stdio.h> #include <stdlib.h> int dc(char s[]) { 	int length=strlen(s),t,i; 	for (i=0;i<length/2;i++) 	{ 		if(s[i]!=s[length-i-1]) 			return 0; 	}     t=1;     return (t+dc(s[length/2])); } int main() { 	char s[]={"ABBA"};     printf("%d",dc(s)); 	system("pause"); 	return 0; }太谢谢你了,这是我想要的结果,可是为什么要添加这个&

user: user-0
content: 引用 13 楼 myzts 的回复:#include <stdio.h> #include <stdlib.h> int dc(char s[]) { 	int length=strlen(s),t,i; 	for (i=0;i<length/2;i++) 	{ 		if(s[i]!=s[length-i-1]) 			return 0; 	}     t=1;     return (t+dc(s[length/2])); } int main() { 	char s[]={"ABBA"};     printf("%d",dc(s)); 	system("pause"); 	return 0; } 太谢谢你了,这是我想要的结果,可是为什么要添加这个&

user: user-3
content: 引用 5 楼 u011337306 的回复:[quote=引用 3 楼 myzts 的回复:] [quote=引用 1 楼 u011337306 的回复:] 这简单的东西就得自己去调试了，又不是什么复杂的算法，把那些参数都可以输出来看看！ 新手,调试了的,对递归不熟悉,需要指导...[/quote] 给你个例子参考：  int  f(int n) { 	int sum=0; 	if(n==0)  return 1; 	else 	return 2*f(n-1); }  void main() { 	int sum =0; 	sum	= f(10); 	printf("%d\n",sum);   // 结果1024 = 2^10 } //递归过程：先递归求出上一个值：f(10)-->f(9)-->...--->f(0)  = 1 //然后：再依次求出f(10)：f(0) ---->>   f(1)-->f(2)-->...--->f(10) = 1024  不知道说清楚没？先动手，实在不行，我们再帮你！学习是自己的事情，动手多加调试信息才是硬道理！[/quote]上面f函数多打了一行，int sum = 0，多余。。

user: user-3
content: 引用 3 楼 myzts 的回复:[quote=引用 1 楼 u011337306 的回复:] 这简单的东西就得自己去调试了，又不是什么复杂的算法，把那些参数都可以输出来看看！ 新手,调试了的,对递归不熟悉,需要指导...[/quote] 给你个例子参考：  int  f(int n) { 	int sum=0; 	if(n==0)  return 1; 	else 	return 2*f(n-1); }  void main() { 	int sum =0; 	sum	= f(10); 	printf("%d\n",sum);   // 结果1024 = 2^10 } //递归过程：先递归求出上一个值：f(10)-->f(9)-->...--->f(0)  = 1 //然后：再依次求出f(10)：f(0) ---->>   f(1)-->f(2)-->...--->f(10) = 1024  不知道说清楚没？先动手，实在不行，我们再帮你！学习是自己的事情，动手多加调试信息才是硬道理！

user: user-0
content: PS:我的意思是想验证字符串经过多少次对称变化 比如AB一次变为ABBA

user: user-0
content: 引用 1 楼 u011337306 的回复:这简单的东西就得自己去调试了，又不是什么复杂的算法，把那些参数都可以输出来看看！ 新手,调试了的,对递归不熟悉,需要指导...

user: user-4
content: 朋友你好，闲逛csdn发现你的帖子，待会回去听讲座，没太多时间看你的代码，但是我也大致看了一下，你可以在代码后面加上注释，这样，我们可以更快的看懂你的程序，听完讲座回来的时候，我再看一下你的程序。 希望我说的对你有帮助。

user: user-3
content: 这简单的东西就得自己去调试了，又不是什么复杂的算法，把那些参数都可以输出来看看！

user: user-0
content: #include <stdio.h> #include <stdlib.h> int dc(char s[]) { 	int length=strlen(s),t,i; 	for (i=0;i<length/2;i++) 	{ 		if(s[i]!=s[length-i-1]) 			return 0; 	}     t=1;     return (t+dc(s[length/2])); } int main() { 	char s[]={"ABBA"};     printf("%d",dc(s)); 	system("pause"); 	return 0; }

user: user-0
content: [code=c]#include <stdio.h> #include <stdlib.h> int dc(char s[]) { 	int length=strlen(s),t,i; 	for (i=0;i<length/2;i++) 	{ 		if(s[i]!=s[length-i-1]) 			return 0; 	}     t=1;     return (t+dc(s[length/2])); } int main() { 	char s[]={"ABBA"};     printf("%d",dc(s)); 	return 0; }[/code

user: user-0
content: 引用 6 楼 u011337306 的回复:[quote=引用 5 楼 u011337306 的回复:] [quote=引用 3 楼 myzts 的回复:] [quote=引用 1 楼 u011337306 的回复:] 这简单的东西就得自己去调试了，又不是什么复杂的算法，把那些参数都可以输出来看看！ 新手,调试了的,对递归不熟悉,需要指导...[/quote] 给你个例子参考：  int  f(int n) { 	int sum=0; 	if(n==0)  return 1; 	else 	return 2*f(n-1); }  void main() { 	int sum =0; 	sum	= f(10); 	printf("%d\n",sum);   // 结果1024 = 2^10 } //递归过程：先递归求出上一个值：f(10)-->f(9)-->...--->f(0)  = 1 //然后：再依次求出f(10)：f(0) ---->>   f(1)-->f(2)-->...--->f(10) = 1024  不知道说清楚没？先动手，实在不行，我们再帮你！学习是自己的事情，动手多加调试信息才是硬道理！[/quote]上面f函数多打了一行，int sum = 0，多余。。[/quote] 我把我的代码改了 #include <stdio.h> #include <stdlib.h> int dc(char s[]) { 	int length=strlen(s),t,i; 	for (i=0;i<length/2;i++) 	{ 		if(s[i]!=s[length-i-1]) 			return 0; 	}     t=1;     return (t+dc(s[length/2])); } int main() { 	char s[]={"ABBA"};     printf("%d",dc(s)); 	system("pause"); 	return 0; } 可是Segmentation fault了

user: user-5
content: “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

user: user-6
content: int xp(char s[l/2],int y); // 这个相当于一个空的函数声明 xp(char s[l/2],int y); // 这个是调用函数

user: user-7
content: #include <stdio.h> #include <stdlib.h> int xp(char s[],int y) { int i,l=strlen(s);//没有strlen()的头文件 if(l==0) return y; for(i=0;i<l/2;i++) { 	if(s[i]!=s[l-i-1]) 		return y; }  	y+=1; 	int xp(char s[l/2],int y);//函数调用前面不选要加返回类型，可能你是想写xp(s[l/2],y); } int main() { 	char s[]={"ABBA"};     printf("%d",xp((s),0));//(s)不需要这么写啊 	system("pause"); 	return 0; }

user: user-8
content: 一步一步调试。。。。就可以知道了。。