вызов ф-ций: нужен ли фрейм?? (пишу интерпретатор)
От: sinmaster  
Дата: 29.07.08 16:25
Оценка:
привет всем. я здесь новичёк.
в университете поставили задачу создать простейшийинтерпретатор языка программирования. почти что все уже я реализовал, но вот у меня сейчас встал вопрос касаемо реализации вызова ф-ций самих из себя. видимо, я что-то здесь пропустил и недореализовал, т.к. рекурсивные версии ф-ций не всеработают корректно в моем ЯП.
скажем, если описать ф-цию фиббоначчи на моем языке:
int fibbonachi(int n){
  print("n=");print(n); ##debug 
  if (n<=0){print("BUG");} ##debug
  if (n<=2){return 1;}
  return fib(n-1)+fib(n-2);
}

то я получу некорректный дебаг вывод:

**n=7n=6n=5n=4n=3n=2n=0BUGn=-2BUGn=-4BUGn=-6BUGn=-8BUG[

а ежели ф-цию по вычислению факториала числа, то получу верный дебаг вывод и результат
int fact(int x){
  if (x==0){return 1;}
  return x*fact(x-1);
}

***n=5n=4n=3n=2n=1n=0

результат равен 120. (здесь не указал просто)
я так понимаю, я не предусмотрел создание при кажд вызове ф-ции её фрейма, чтобы при кажд новом её вызове аргументы ф-ции были бы независимы от аргументов которые были переданы в ф-цию в её предыдущем вызове.
сейчас у меня при кажд вызове ф-ции используются одни и те же аргументы (переменные лежащие в таблице), и ,после первого прогона ф-ции fib(n-1) в n заносится 0, и далее в вызов fib(n-2) заносится уже нуль, а не значение вычисленное относительно оригинального значения параметра n. отсюда и баг.
вопрос -- правильно ли я догадываюсь, что мне надо реализовать копирование значений аргументов при каждом рекурс. вызове ф-ции в свою область, "фрейм", чтобы они были независимы между др др??
(так досадно, все реализовал, а вот с функциями недогоняю...а на лекциях эти тонкости не разобрали мы, потому не знаю что и предприняыть).
большое всем спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.