Код:
reciprocalRational(rat) {
num1 = car(car(rat));
signInt1 = cdr(car(rat));
num2 = car(cdr(rat));
signInt2 = cdr(cdr(rat)) ~ signInt1;
newInt1 = cons(num2, signInt2);
newInt2 = cons(num1, []);
return cons(newInt1, newInt2);
}
divideRationals(rat1, rat2) {
return multiplyRationals(rat1, reciprocalRational(rat2));
}
naturalPowerOfRational(rat1, num2) {
ans = cons(cons([[]], []), cons([[]], []));
count = [];
whilene ([count] * num2) {
count = nextNumber(count);
ans = multiplyRationals(ans, rat1);
}
return ans;
}
integerPowerOfRational(rat1, int2) {
num2 = car(int2);
signInt2 = cdr(int2);
power = naturalPowerOfRational(rat1, num2);
ife (signInt2) {
return power;
}
ifne (signInt2) {
return reciprocalRational(power);
}
}
Кстати, хорошо бы еще добавить оператор const, которым будут помечаться неизменяемые и видимые из всех функций константы, типа 1 или 0.
-- 24 мар 2020, 21:58 --Код:
naturalRootOfRational(rat1, num2, iter = /* тут должна быть простыня, содержащая число 10 */) {
ans = cons(cons([[]], []), cons([[]], []));
count = [];
whilene ([count] * iter) {
a = substractIntegers(cons(num2, []), cons([[]], []));
b = multiplyRationals(cons(a, cons([[]], [])), ans);
c = divideRationals(rat1, integerPowerOfRational(ans, a));
ans = divideRationals(addRationals(b, c), cons(cons(num2, []), cons([[]], [])));
}
return ans;
}
Кстати, я только что понял. В моей форме записи натуральных чисел невозможно записывать числа больше какого-то не очень большого предела...