user-0 提问: 递归思路问题

回复:
user: user-1
content: 引用 7 楼 cfjtaishan 的回复:[quote=引用 6 楼 PpBearGoGoGo 的回复:] [quote=引用 5 楼 cfjtaishan 的回复:] [quote=引用 4 楼 PpBearGoGoGo 的回复:]  #include <stdio.h>     double num(int n)//分子 { 	if (n < 0) 		return 0; 	else if (n == 0) 		return 2; 	else if (n == 1) 		return 2; 	else if (n == 2) 		return 3; 	else 		return  num(n - 1) + num(n - 2); } double den(int n)//分母 { 	if (n < 0) 		return 0; 	else if (n == 0) 		return 1; 	if (n == 1) 		return 1; 	else if (n == 2) 		return 2; 	else 		return  den(n - 1) + den(n - 2); }  double solve(int n) { 	double sum = 0; 	double temp = 0; 	for (int i = 1; i < n + 1; i++) 	{ 		temp =num(i) / den(i); 		sum += temp; 		printf("第%d项 = %f \n", i,temp); 	} 	return sum; }  int main() { 	while (true) 	{ 		int n; 		double sum = 0; 		printf("输入n:"); 		scanf_s("%d", &n, 1);//scanf("%d", &n);  		sum = solve(n); 		printf("前n项和: %f\n\n", sum);  		 	}   	system("pause"); 	return 0;   这样思路很清晰 n<0不可能递归到，因为n == 0 和n == 1时已经停止递归了； 另外，分子分母的递归有逻辑冗余，二者可以合二为一[/quote]  小于0当然不行，等于0和小于0只是为 n=1或者2服务的[/quote] 不是针对你的代码不能运行，而是考虑代码有冗余，n < 0不会运行到。因为你的代码对于0， 1， 2的判断已经很明确了。 if (n == 1)         return 1;     else if (n == 2)         return 2; 遇到1,2就直接返回了，怎么还会让1,2在减1呢？[/quote] 就是递归到0,1后就直接返回了，不会继续递归了。所以，n < 0不会执行嘛

user: user-1
content: 引用 6 楼 PpBearGoGoGo 的回复:[quote=引用 5 楼 cfjtaishan 的回复:] [quote=引用 4 楼 PpBearGoGoGo 的回复:]  #include <stdio.h>     double num(int n)//分子 { 	if (n < 0) 		return 0; 	else if (n == 0) 		return 2; 	else if (n == 1) 		return 2; 	else if (n == 2) 		return 3; 	else 		return  num(n - 1) + num(n - 2); } double den(int n)//分母 { 	if (n < 0) 		return 0; 	else if (n == 0) 		return 1; 	if (n == 1) 		return 1; 	else if (n == 2) 		return 2; 	else 		return  den(n - 1) + den(n - 2); }  double solve(int n) { 	double sum = 0; 	double temp = 0; 	for (int i = 1; i < n + 1; i++) 	{ 		temp =num(i) / den(i); 		sum += temp; 		printf("第%d项 = %f \n", i,temp); 	} 	return sum; }  int main() { 	while (true) 	{ 		int n; 		double sum = 0; 		printf("输入n:"); 		scanf_s("%d", &n, 1);//scanf("%d", &n);  		sum = solve(n); 		printf("前n项和: %f\n\n", sum);  		 	}   	system("pause"); 	return 0;   这样思路很清晰 n<0不可能递归到，因为n == 0 和n == 1时已经停止递归了； 另外，分子分母的递归有逻辑冗余，二者可以合二为一[/quote]  小于0当然不行，等于0和小于0只是为 n=1或者2服务的[/quote] 不是针对你的代码不能运行，而是考虑代码有冗余，n < 0不会运行到。因为你的代码对于0， 1， 2的判断已经很明确了。 if (n == 1)         return 1;     else if (n == 2)         return 2; 遇到1,2就直接返回了，怎么还会让1,2在减1呢？

user: user-2
content: 引用 8 楼 cfjtaishan 的回复:[quote=引用 7 楼 cfjtaishan 的回复:] [quote=引用 6 楼 PpBearGoGoGo 的回复:] [quote=引用 5 楼 cfjtaishan 的回复:] [quote=引用 4 楼 PpBearGoGoGo 的回复:]  #include <stdio.h>     double num(int n)//分子 { 	if (n < 0) 		return 0; 	else if (n == 0) 		return 2; 	else if (n == 1) 		return 2; 	else if (n == 2) 		return 3; 	else 		return  num(n - 1) + num(n - 2); } double den(int n)//分母 { 	if (n < 0) 		return 0; 	else if (n == 0) 		return 1; 	if (n == 1) 		return 1; 	else if (n == 2) 		return 2; 	else 		return  den(n - 1) + den(n - 2); }  double solve(int n) { 	double sum = 0; 	double temp = 0; 	for (int i = 1; i < n + 1; i++) 	{ 		temp =num(i) / den(i); 		sum += temp; 		printf("第%d项 = %f \n", i,temp); 	} 	return sum; }  int main() { 	while (true) 	{ 		int n; 		double sum = 0; 		printf("输入n:"); 		scanf_s("%d", &n, 1);//scanf("%d", &n);  		sum = solve(n); 		printf("前n项和: %f\n\n", sum);  		 	}   	system("pause"); 	return 0;   这样思路很清晰 n<0不可能递归到，因为n == 0 和n == 1时已经停止递归了； 另外，分子分母的递归有逻辑冗余，二者可以合二为一[/quote]  小于0当然不行，等于0和小于0只是为 n=1或者2服务的[/quote] 不是针对你的代码不能运行，而是考虑代码有冗余，n < 0不会运行到。因为你的代码对于0， 1， 2的判断已经很明确了。 if (n == 1)         return 1;     else if (n == 2)         return 2; 遇到1,2就直接返回了，怎么还会让1,2在减1呢？[/quote] 就是递归到0,1后就直接返回了，不会继续递归了。所以，n < 0不会执行嘛[/quote] 嗯嗯 对

user: user-2
content: 引用 7 楼 cfjtaishan 的回复:[quote=引用 6 楼 PpBearGoGoGo 的回复:] [quote=引用 5 楼 cfjtaishan 的回复:] [quote=引用 4 楼 PpBearGoGoGo 的回复:]  #include <stdio.h>     double num(int n)//分子 { 	if (n < 0) 		return 0; 	else if (n == 0) 		return 2; 	else if (n == 1) 		return 2; 	else if (n == 2) 		return 3; 	else 		return  num(n - 1) + num(n - 2); } double den(int n)//分母 { 	if (n < 0) 		return 0; 	else if (n == 0) 		return 1; 	if (n == 1) 		return 1; 	else if (n == 2) 		return 2; 	else 		return  den(n - 1) + den(n - 2); }  double solve(int n) { 	double sum = 0; 	double temp = 0; 	for (int i = 1; i < n + 1; i++) 	{ 		temp =num(i) / den(i); 		sum += temp; 		printf("第%d项 = %f \n", i,temp); 	} 	return sum; }  int main() { 	while (true) 	{ 		int n; 		double sum = 0; 		printf("输入n:"); 		scanf_s("%d", &n, 1);//scanf("%d", &n);  		sum = solve(n); 		printf("前n项和: %f\n\n", sum);  		 	}   	system("pause"); 	return 0;   这样思路很清晰 n<0不可能递归到，因为n == 0 和n == 1时已经停止递归了； 另外，分子分母的递归有逻辑冗余，二者可以合二为一[/quote]  小于0当然不行，等于0和小于0只是为 n=1或者2服务的[/quote] 不是针对你的代码不能运行，而是考虑代码有冗余，n < 0不会运行到。因为你的代码对于0， 1， 2的判断已经很明确了。 if (n == 1)         return 1;     else if (n == 2)         return 2; 遇到1,2就直接返回了，怎么还会让1,2在减1呢？[/quote]  哦！好像是没什么用，是我想多了，以为n为1的时候还需要的，写多了，小于零不会执行

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

user: user-2
content: 引用 5 楼 cfjtaishan 的回复:[quote=引用 4 楼 PpBearGoGoGo 的回复:]  #include <stdio.h>     double num(int n)//分子 { 	if (n < 0) 		return 0; 	else if (n == 0) 		return 2; 	else if (n == 1) 		return 2; 	else if (n == 2) 		return 3; 	else 		return  num(n - 1) + num(n - 2); } double den(int n)//分母 { 	if (n < 0) 		return 0; 	else if (n == 0) 		return 1; 	if (n == 1) 		return 1; 	else if (n == 2) 		return 2; 	else 		return  den(n - 1) + den(n - 2); }  double solve(int n) { 	double sum = 0; 	double temp = 0; 	for (int i = 1; i < n + 1; i++) 	{ 		temp =num(i) / den(i); 		sum += temp; 		printf("第%d项 = %f \n", i,temp); 	} 	return sum; }  int main() { 	while (true) 	{ 		int n; 		double sum = 0; 		printf("输入n:"); 		scanf_s("%d", &n, 1);//scanf("%d", &n);  		sum = solve(n); 		printf("前n项和: %f\n\n", sum);  		 	}   	system("pause"); 	return 0;   这样思路很清晰 n<0不可能递归到，因为n == 0 和n == 1时已经停止递归了； 另外，分子分母的递归有逻辑冗余，二者可以合二为一[/quote]  小于0当然不行，等于0和小于0只是为 n=1或者2服务的

user: user-1
content: 引用 4 楼 PpBearGoGoGo 的回复: #include <stdio.h>     double num(int n)//分子 { 	if (n < 0) 		return 0; 	else if (n == 0) 		return 2; 	else if (n == 1) 		return 2; 	else if (n == 2) 		return 3; 	else 		return  num(n - 1) + num(n - 2); } double den(int n)//分母 { 	if (n < 0) 		return 0; 	else if (n == 0) 		return 1; 	if (n == 1) 		return 1; 	else if (n == 2) 		return 2; 	else 		return  den(n - 1) + den(n - 2); }  double solve(int n) { 	double sum = 0; 	double temp = 0; 	for (int i = 1; i < n + 1; i++) 	{ 		temp =num(i) / den(i); 		sum += temp; 		printf("第%d项 = %f \n", i,temp); 	} 	return sum; }  int main() { 	while (true) 	{ 		int n; 		double sum = 0; 		printf("输入n:"); 		scanf_s("%d", &n, 1);//scanf("%d", &n);  		sum = solve(n); 		printf("前n项和: %f\n\n", sum);  		 	}   	system("pause"); 	return 0;   这样思路很清晰 n<0不可能递归到，因为n == 0 和n == 1时已经停止递归了； 另外，分子分母的递归有逻辑冗余，二者可以合二为一

user: user-2
content: #include <stdio.h>     double num(int n)//分子 { 	if (n < 0) 		return 0; 	else if (n == 0) 		return 2; 	else if (n == 1) 		return 2; 	else if (n == 2) 		return 3; 	else 		return  num(n - 1) + num(n - 2); } double den(int n)//分母 { 	if (n < 0) 		return 0; 	else if (n == 0) 		return 1; 	if (n == 1) 		return 1; 	else if (n == 2) 		return 2; 	else 		return  den(n - 1) + den(n - 2); }  double solve(int n) { 	double sum = 0; 	double temp = 0; 	for (int i = 1; i < n + 1; i++) 	{ 		temp =num(i) / den(i); 		sum += temp; 		printf("第%d项 = %f \n", i,temp); 	} 	return sum; }  int main() { 	while (true) 	{ 		int n; 		double sum = 0; 		printf("输入n:"); 		scanf_s("%d", &n, 1);//scanf("%d", &n);  		sum = solve(n); 		printf("前n项和: %f\n\n", sum);  		 	}   	system("pause"); 	return 0;   这样思路很清晰

user: user-1
content: #include <stdio.h>    int fab(int n) { 	if (n == 0 || n == 1) 		return 1; 	else 		return fab(n - 1) + fab(n - 2); }  double sum(int tm) { 	double total = 0; 	int i; 	 	for (i = 1; i <= tm; i++) { 		printf("a = %d\n", fab(i+1)); 		printf("b = %d\n", fab(i)); 		total += fab(i+1) * 1.0/fab(i); 	}  	return total; }    int main(void) { 	int n; 	scanf("%d", &n); 	printf("%lf\n", sum(n));     return 0; } 参考一下吧

user: user-4
content: #include <stdio.h>  float Fabonacci(int a, int b, int c, int d, int beg, int n, float sum) { 	if(beg < n){ 		printf("%d/%d + ", c, d); 		Fabonacci(c, d, a + c, b + d, beg + 1, n, sum + (float)c / (float)d); 	}else{ 		printf("\b\b= %f\n", sum); 		return sum; 	} }  int main(void) { 	Fabonacci(1, 1, 2, 1, 0, 5, 0.0); 	 	return 0; } 2/1 + 3/2 + 5/3 + 8/5 + 13/8 = 8.391666