Рекурсивная и не рекурсивная с++

253
06 ноября 2017, 22:28

Написал код но выводить неправильно в чем проблема?

#include "stdafx.h"
#include <iostream>
#include <locale.h>
#include <math.h>
using namespace std;
double* aArrayX; 
// нерекурсивная функция
double Calculate(int N) 
{
    double Summ=0;
    for(int i=1;i<=N;i++)
        Summ+=pow(aArrayX[i],2);
    return Summ;
}
// рекурсивная функция
double CalculateRec(int N)
{
    if (N>=1)
        return pow(aArrayX[N],2)+CalculateRec(N-1);
    else 
        return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"rus");
    int N;
    double fResult;
    cout<<"Input N"<<endl;
    cin>>N;
    if (N>0)
    {
        // применение оператора new для формирования указателя на массив
        aArrayX=new double [N];
        // инициазизация элементов массива
        cout<<"Input x(0):"<<endl;
        cin>>aArrayX[0];
        cout<<"Input x(1):"<<endl;
        cin>>aArrayX[1];
        for(int i=2;i<=N;i++)
            aArrayX[i+1]=pow(aArrayX[i],2) - pow(aArrayX[i-1],2);
        // вызов нерекурсивной функции Calculate
        fResult=Calculate(N);
        cout<<"Result(not recursion)= "<<fResult<<endl;
        // вызов рекурсивной функции CalculateRec
        fResult=CalculateRec(N);
        cout<<"Result(recursion)= "<<fResult<<endl;
        // вывод всех элементов x(i)
        for(int i=0;i<=N;i++)
            cout<<"x("<<i<<")= "<<aArrayX[i]<<endl;
    } 
    system("pause");
    return 0;
}
Answer 1

Указатель aArrayX указывает на массив из N элементов, в функции Calculate i может дойти до этого значения на последней итерации i<=N, тем самым выйдя за предел массива, в функции CalculateRec выход за предел массива происходит сразу же, в main циклы for опять же выходит за предел массива. Каждый такой выход - неопределенное поведение Перед разыменованием указателя следует проверять, входит ли индекс в диапазон. Память, выделенная для aArrayX утекает. Ну и использовать глобальные переменные не следует. Совсем.

Answer 2

Ну вот как Linux написать, так он тут как тут, а как простенькую программку...

Поскольку ваше решение из серии "зачем просто, если можно сложно?", пишу заново:

void Iteration()
{
    double x0 = 0.3, x1 = 0.5;
    double Z = x1*x1;
    for(int n = 1; n <= 7; ++n)
    {
        cout << "n = " << n << " Z = " << setprecision(12) << Z << endl;
        double x = x1*x1-x0*x0;
        Z += x*x;
        x0 = x1;  x1 = x;
    }
}
void Recursion(double x0 = 0.3, double x1 = 0.5, double Z = 0.0, int n = 1)
{
    if (n > 7) return;
    Z += x1*x1;
    cout << "n = " << n << " Z = " << setprecision(12) << Z << endl;
    Recursion(x1,x1*x1-x0*x0,Z,n+1);
}
int main(int argc, const char * argv[])
{
    cout << "Iteration:\n";
    Iteration();
    cout << "Recursion:\n";
    Recursion();
}
READ ALSO
найти натуральное число n представимое суммой кубов двух натуральных чисел,двумя различными способами [требует правки]

найти натуральное число n представимое суммой кубов двух натуральных чисел,двумя различными способами [требует правки]

Найти натуральное число n представимое суммой кубов двух натуральных чисел двумя разными способамиx^3+y^3,(x<=y)

242
график работы на php и jquery

график работы на php и jquery

может кому-то уже доводилось создавать график работы на сайте, или кто-то знает существует ли плагин для создания графика, я на данный момент...

280
Движение по кругу [требует правки]

Движение по кругу [требует правки]

ЗдравствуйтеЯ хочу заставить эти стрелки вращаться вокруг телефона посредством :hower

353