Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2008, 22:14   #1
Morrigan13
 
Аватар для Morrigan13
 
Регистрация: 28.03.2008
Сообщений: 8
Печаль Ошибка переполнения стека из-за использования рекурсий

Привет! Мне срочно необходима ваша помощь! Я пыталась вставить рекурсию в функцию, и все никак не получается. При выполнении программа падает с сообщением об ошибке "Error 202: Stack overflow error".
Помогите исправить ошибку, пожалуйста.=)


function ToDec(n:string; radix:word):word;
var
m,i,Func:word;
const
digit:string[16]='0123456789ABCDEFGHIJKLMNOPQRSTUVW XYZ';
begin
m:=0;
while n[1]='0' do
delete(n,1,1);
for i:=1 to length(n) do
ToDec:=m*radix+pos(n[i],digit)-1;
Func:=ToDec(n[i-1],radix);
ToDec:=m+Func;
end;
"Я - часть той силы, что вечно хочет зла и вечно совершает благо"(с)
Morrigan13 вне форума Ответить с цитированием
Старый 01.04.2008, 22:54   #2
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
Сообщение

Для начала:
В строке
Цитата:
const digit:string[16]='012345678ABCDEFGHIJKLMNOPQRSTUVWX YZ';
не 16 символов, а 36.
Alter вне форума Ответить с цитированием
Старый 01.04.2008, 23:00   #3
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

А зачем вообще рекурсия?
Код:
function ToDec(n:string; radix:word):word;
var
m,i,Func:word;
const
digit:string[36]='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
begin
m:=0;
{while n[1]='0' do
      delete(n,1,1);}
{Зачем этот while? Он, конечно не мешает, но и ничего полезного не делает}
for i:=1 to length(n) do
    m:=m*radix+pos(n[i],digit)-1;
ToDec:=m;
end;
Somebody вне форума Ответить с цитированием
Старый 02.04.2008, 00:40   #4
Morrigan13
 
Аватар для Morrigan13
 
Регистрация: 28.03.2008
Сообщений: 8
По умолчанию

Ну просто у меня задание - написать программу именно с рекурсией... вот... (
Прога без нее отлично работает.
"Я - часть той силы, что вечно хочет зла и вечно совершает благо"(с)
Morrigan13 вне форума Ответить с цитированием
Старый 02.04.2008, 07:56   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ты лучше скажи что ты хочеш сделать, помоему ты стратегию неверную выбрал.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.04.2008, 08:04   #6
Xardas
Сисадмин
Форумчанин
 
Аватар для Xardas
 
Регистрация: 28.12.2007
Сообщений: 320
По умолчанию

Цитата:
Сообщение от Morrigan13 Посмотреть сообщение
Ну просто у меня задание - написать программу именно с рекурсией... вот... (
Прога без нее отлично работает.
В таком случае, давайте немного отвлечемся от этой задачи и представим, что нам надо вычислить значение, например, такого выражения:

2^0+2^1+2^2+2^3+...+2^n

Если внимательно посмотреть на выражение, то можно увидеть, что таким же образом представляется двоичное число в десятичном виде... Пример решения подобной задачи с использованием рекурсии можно найти в любой книге по программированию

Вот функция:
Код:
function ToDec(i:integer):extended;
begin
if i=0 then ToDec:=0
else ToDec:=ToDec(i-1)+strtoint(number[i])*exp(ln(index)*(length(number)-i))
end;
ЗАМЕЧАНИЯ:
1)Переменные index:integer; number:string следует сделать глобальными, в подпрограмму передавать length(number);
2) Писал на Делфи, в Паскале нет функции strtoint, ей альтернативой служит процедура val(st,num,code), преобразует строку st в число num, если преобразование удачное code получит значение 0, иначе - код ошибки; и еще одно, функция переводит только с 2-ой по 10-ую системы, чтобы переводило и 11-ую, 12-ую системы и т.д., необходимо поставить в соответствие букве десятичное число...

ЗЫ По поводу замечания 2), будем считать это Вашим домашним заданием , проблем, думаю, у Вас не возникнет.

Последний раз редактировалось Xardas; 02.04.2008 в 08:41.
Xardas вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите. массив не взамодействует с функцией. какая-то ошибка стека. koir Паскаль, Turbo Pascal, PascalABC.NET 5 10.06.2008 08:32
Неправильный вывод данных из стека С++ Cyberex Общие вопросы C/C++ 3 07.05.2008 16:53
Переполнение стека при передачи функциям массивов большой размерности graphoman Общие вопросы Delphi 2 07.01.2008 21:47
Заполнение стека inkvizitor Общие вопросы Delphi 5 08.10.2007 17:01