| 
			| 
					
						| eugrita 
								Помогающий    Offline | 
								|  | «  : 05-12-2009 13:54 »  |  | 
 
 Классический способ передачи параметров по указателю void display_values(int *a, int *b) {
 *a=1000; *b=1
 }
 void main() {
 int a= 2002, b = 0;
 display_values(&a, &b);
 pruntf(“%i %i”,a,b);  //стало a=1000; b=1;
 
 почему-то не работает в условиях рекурсивного вызова:
 
 void iter(double a, double b,double x0,double x1,int N,int i,double *X,double *sum)
 { //восходящая рекурсия
 double x2;
 x2=a*x1+b*x0;
 if (i==N){
 *X=x2;//здесь *X получает ненулевое значение
 // а проверяя значение 6 параметра (*X) после вызова вижу что он=0?!!!
 return;
 }
 else      {
 x0=x1;x1=x2 ;
 iter(a,b,x0,x1,N,i+1,&X, &sum);
 // (*sum)+=*X; //а здесь вообще ошибка выполнения
 };
 }
 |  
						| 
								|  |  
								| « Последнее редактирование: 06-12-2009 16:34 от eugrita » |  Записан | 
 |  |  | 
	| 
			| 
					
						| Finch 
								СпокойныйАдминистратор    Offline 
								Пол:    
								Пролетал мимо
								
								
								
								
								
							 | 
								|  | « Ответ #1 : 05-12-2009 14:35 »  |  | 
 
 eugrita,  iter(a,b,x0,x1,N,i+1,&X, &sum); Ошибка тут. Зачем давать ссылку на указатель? |  
						| 
								|  |  
								|  |  Записан | 
 
 Не будите спашяго дракона.              Джаффар (Коша) |  |  | 
	| 
			| 
					
						| eugrita 
								Помогающий    Offline | 
								|  | « Ответ #2 : 05-12-2009 15:23 »  |  | 
 
 Так вот и хочу понять. Вроде, способ передачи параметра по ссылке есть (см. мой пример выше)Т.е. хотите сказать, что в моем случае надо было iter(a,b,x0,x1,N,i+1,&X, sum); или даже
 iter(a,b,x0,x1,N,i+1,&X, *sum) ?
 Правда, я выкинул еще и дурацкий параметр double *X, переделав его в возвращаемое значение.
 Теперь выглядит так:
 double iter(double a, double b,double x0,double x1,int N,int i,double *sum)
 { //âîñõîäÿùàÿ ðåêóðñèÿ
 double x2;
 x2=a*x1+b*x0;
 if (i==N)
 return x2;
 x0=x1;x1=x2 ;
 x2=iter(a,b,x0,x1,N,i+1, &sum);
 return x2;//не поставишь здесь return - будет неверно !!!
 }
 
 При этом, если в конце не стоит  return x2 (вроде, по логике, хватает return в блоке  if (i==N){... то вернется не то.
 Видимо, потому что при рекурсивном вызове return через  if (i==N){. лишь самый внутренний,
 а за ним идет ряд возвратов из вышестоящих уровней!!!
 
 |  
						| 
								|  |  
								| « Последнее редактирование: 07-12-2009 07:53 от Sel » |  Записан | 
 |  |  | 
	| 
			| 
					
						| Finch 
								СпокойныйАдминистратор    Offline 
								Пол:    
								Пролетал мимо
								
								
								
								
								
							 | 
								|  | « Ответ #3 :  05-12-2009 17:00 »   |  | 
 
 void iter(double a, double b,double x0,double x1,int N,int i,double *X,double *sum){ //восходящая рекурсия
 double x2;
 x2=a*x1+b*x0;
 if (i==N){
 *X=x2;//здесь *X получает ненулевое значение
 // а проверяя значение 6 параметра (*X) после вызова вижу что он=0?!!!
 return;
 }
 else      {
 x0=x1;x1=x2 ;
 iter(a,b,x0,x1,N,i+1, X, sum);
 (*sum)+=(*X); //а здесь вообще ошибка выполнения
 }
 }
 
Читай более внимательно правила работы с указателями. У тебя переменная X и sum уже являются указателем. Зачем к ним применять какие то действия, чтобы они стали указателем? |  
						| 
								|  |  
								|  |  Записан | 
 
 Не будите спашяго дракона.              Джаффар (Коша) |  |  | 
	| 
			| 
					
						| eugrita 
								Помогающий    Offline | 
								|  | « Ответ #4 : 06-12-2009 20:16 »  |  | 
 
 Итог исследования1)не получился никакой вариант рекурсивного вычисления одновременно в одной функции и члена последовательности и суммы.  (ниже один из неверных вариантов) 2)правильный вариант получился с разбиением вычисления элемента и суммы на 2 функцииdouble iter(double a, double b,double x0,double x1,int N,int i,double *X){ //восходящая рекурсия
 double x2,sum;
 x2=a*x1+b*x0;
 if (i==N){
 *X=x2;
 sum+=x2;
 return sum;
 }
 else {
 x0=x1;x1=x2 ;
 [b]sum+=iter(a,b,x0,x1,N,i+1,X);[/b]
 //sum+=*X;
 return sum;
 };
 }
 
 (наполовину взаимная рекурсия)  ниже ===================================================== void iterX(double a, double b,double x0,double x1,int N,int i,double *X){ //восходящая рекурсия
 double x2=a*x1+b*x0;
 if (i==N)
 {*X=x2; return;}
 else {
 x0=x1;x1=x2 ;
 [b] iterX(a,b,x0,x1,N,i+1,X);[/b]
 };
 }
 
 [b]void iterS(double a, double b,double x0,double x1,int N,int i,double *sum)[/b]
 { //восходящая рекурсия
 double x,x2=a*x1+b*x0;
 if (i==N)
 {*sum+=x2; return;}
 else {
 [b] iterX(a,b,x0,x1,N,i,&x);[/b]
 (*sum)+=x;
 [b] iterS(a,b,x0,x1,N,i+1,sum);[/b]
 };
 }
 
 //вызов
 iterX(a,b,x0,x1,n,2,&x);
 printf("x[%i]=%f\n\n",n,x);
 Sum=0;
 iterS(a,b,x0,x1,n,2,&Sum);
 Sum+=x0+x1;
 printf("S[%i]=%f\n\n",n,Sum);
 
 |  
						| 
								|  |  
								| « Последнее редактирование: 06-12-2009 20:24 от Finch » |  Записан | 
 |  |  | 
	| 
			| 
					
						| lapulya 
								Молодой специалист    Offline | 
								|  | « Ответ #5 : 28-12-2009 12:14 »  |  | 
 
 Есть штука такая... ссылка называется (типа указателя, но не указатель    ), рекомендую ознакомиться рекурсией запросто можно реализовать то, что тебе нужно. Кстати вообще не понял зачем в iterS передавать X? Какой смысл? Вот так будет достаточно (по идее, не запускал)  double iter(double a, double b, double x0, double x1, int N, int i){ //восходящая рекурсия
 double sum = 0;
 double x2 = a * x1 + b * x0;
 if (i == N)
 sum += x2;
 else
 sum += iter(a, b, x1, x2, N, i+1, X);
 
 return sum;
 }
 |  
						| 
								|  |  
								|  |  Записан | 
 
 С уважением Lapulya |  |  | 
	|  |