#c #recursion
#c #рекурсия
Вопрос:
Привет, ребята! Мне была назначена эта программа, которая была довольно простой и не требовала много времени для написания кода, но я не могу заставить ее работать. Ничего не печатается, и я думаю, это потому, что это переходит в бесконечный цикл. Просто ищу исправление этого.
Задание:
Напишите и протестируйте рекурсивную функцию, которая возвращает значение следующего рекурсивного определения:
f(x) = 0 if x <= 0 f(x- 1) 2 otherwise
Моя программа:
#include <stdio.h>
int main(void)
{
int n, x;
int factorial(int n) {
if (x <= 0) {
printf("x equals: ");
return 1;
} else {
return n * factorial(n - 1); //error here
}
f(x) = f(x - 1) 2;
}
return 0;
}
Комментарии:
1. В этом есть хитрость. Это включает в себя отступ в коде так, чтобы элементы внутри
{
и}
имели четыре (4) дополнительных пробела впереди. Если вы правильно расставите отступы в своем коде, вы сможете увидеть некоторые из созданных вами проблем.2. Добавляйте printf везде, где считаете нужным, и попробуйте выполнить отладку. Хм, перенос факториала в отдельный метод был бы хорошей отправной точкой.
3. Или вообще удаление факториала, поскольку он фактически никогда не использовался.
4. И тогда Бог сказал «пусть будет astyle», и там был приличный отступ. codepad.org/TfIWk6kM
5. Я думаю, что первые две строки в этом блоке кода — это назначение; т. Е. код должен выглядеть как codepad.org/xqkyhdxA — возможно, это не очень хороший пример рекурсии, но я думаю, что он отвечает на реальный вопрос.
Ответ №1:
Я вижу это неправильно? Почему существует
f (x)=f(x-1) 2;
в вашей факториальной функции int?
Комментарии:
1. Собирался сделать тот же комментарий. Есть ли в программе какая-либо функция с именем f()? В частности, это полный код или только его часть?
Ответ №2:
Этот код не должен компилироваться как есть. Вы не можете определить одну функцию внутри другой на C, поэтому вам нужно создать другую функцию снаружи main()
и вызвать ее.
Я предлагаю вам полностью удалить функцию factorial (), поскольку она, по-видимому, не имеет отношения к этому заданию.
Базовая структура вашей программы должна быть:
#include <stdio.h>
int f(int x)
{
//definition of recursive function
}
int main(void)
{
//call to recursive function
return 0;
}
Задание дает вам определение рекурсивной функции; вам просто нужно перевести его на C.
Ответ №3:
Вы должны определить факториальную функцию в main, что невозможно.Отделите его определение от main() и вызовите его из main().
Надеюсь, это сработает.Сначала исправьте это, а затем только что-то можно будет сделать.
Ответ №4:
-
Вы объявили факториал внутри main.
-
Вы не вызываете factorial в main.
Ответ №5:
Вы хотите что-то вроде этого:
int factorial(int n) {
//calculate the factorial
return resu<
}
int main() {
int result = factorial(10); // Calculate 10!
printf("10! is %d", result);
}
P.S. Спасибо, что честно сказали, что это домашнее задание!
Ответ №6:
Вас просят реализовать f(x)
, определенный как:
f(x) = 0 if x <= 0
f(x-1) 2 otherwise
Итак, прежде всего, забудьте о факториале, я предполагаю, что вы использовали его в качестве примера или рекурсивной функции, но это не то, что вас просят здесь сделать.
Вам нужно реализовать функцию f
, и реализация будет выглядеть следующим образом:
int f( int x ) {
if( x <= 0 ){
return /*something*/;
}else{
return /*something else*/;
}
}
Прочитав данное вам определение f(x)
, вы можете понять, каким /*something*/
и /*something else*/
должно быть.
Затем вас попросят «протестировать» вашу реализацию. Вы делаете это, видя, какие значения f
возвращает ваша main
функция, которая будет выглядеть:
int main(void){
printf("f(1) is %dn", f(1));
printf("f(13) is %dn", f(13));
/* .. more tests here if you want .. */
return 0;
}
Ответ №7:
- Вы определили
factorial ()
функцию внутри основной функции. Это не разрешено. Вам нужно удалить всю функцию из main. - Вы сделали
f(x) = f(x - 1) 2;
. Здесь у вас есть функция в левой части присваивания, которая неверна. Также я не мог понять, что было причиной такой попытки.
Код, который требуется для компьютерной рекурсивной функции, является:
#include <stdio.h>
int main (void)
{
int x, y;
printf ("nEnter x: ");
scanf ("%d", amp;x);
y = f (x);
printf ("n%dn", y);
return 0;
}
int f (int x)
{
if (x <= 0)
{
return 0;
}
else
{
return f (x - 1) 2;
}
}
Я не мог понять, почему функция factorial появилась на вашем пути. Возможно, вы хотели модифицировать его и реализовать данную проблему.
Ответ №8:
#include<stdio.h>
int fun(float i){
int p;
if(i<=0){
return 0;
}
else{
i-=1;
p=fun(i) 2;
}
return p;
}
void main(){
float i;
printf("Enter the number: ");
scanf("%f",amp;i);
printf("nThe output is %d",fun(i));
}
Проверьте это.
Ответ №9:
Я думаю, это то, что вам нужно. #включить int f(int x);
int main(void){
int result = f(x);
printf("10! is %d", result);
return 0;
}
int f(int x) {
if (x <= 0) return 0;
return x*f(x-1) 2; // No more error here. This is where recursion begins
}
Кстати, это не факториальная функция.
Комментарии:
1. Нет -1 от меня 🙂 Однако для вопросов с тегами «меньше значит больше» часто применяется принцип «меньше значит больше».