所以,我有两个问题。
问题1)我发现C中的递归很困难。我有一个问题,我不知道应该怎么做才能尝试。我想知道它的输出,请帮助我。
#include <stdio.h>
void fun (int);
int main (void)
{
int a;
a = 3;
fun(a);
printf("\n");
return 0;
}
void fun ( int n )
{
if ( n > 0 )
{
fun(--n);
printf("%d",n);
fun(--n);
}
}
如何手动解决此递归问题? 我知道在递归期间,信息存储在堆栈中。因此,我尝试这样做。首先,a将一直递减到0.然后,它将退出循环。那么,何时会打印出值?
问题2)此外,我想知道,因为我现在正在研究的主题是功能。如果我创建一个函数并假设它返回一些值,那么我是在调用时收集它的值还是我可以调用它而不收集它的返回值?
例如:假设我将函数设为,
int foo ( int a )
{
........
return b;
}
现在,如果我从main内部调用此函数,那么我是否必须将返回的值存储在某个变量中?
答案 0 :(得分:7)
你有两个问题:第一个是你的代码中发生的事情:
问题#1:可以重写函数fun(n)
,使其功能相同但更容易理解,如:
void fun(n) {
if (n > 0) {
fun(n - 1);
printf("%d", n - 1);
fun(n - 2);
}
}
那是:
for fun(n)
if n > 0,
first call fun(n - 1)
then print the number n - 1
lastly call fun(n - 2)
因此,在展开递归时会发生以下情况:
fun(3) ->
fun(2) ->
fun(1) ->
fun(0) ->
n <= 0 -> exits
prints 0
fun(-1) ->
n <= 0 - exits
prints 1
fun(0) ->
n <= 0 - exits
prints 2
fun(1) ->
fun(0) ->
exits as n <= 0
prints 0
fun(-1) ->
exits as n <= 0
执行顺序从上到下 - 因此来自0120
行的输出prints
。
问题#2:
不,返回值不需要存储在变量中。事实上,您使用的printf
返回int
,它表示写入的字符数,但您没有将该返回值存储在任何位置。
答案 1 :(得分:2)
没有1 - 拿一个记事本和一支铅笔。
开始写作fun(3)
- 它在Main。
您现在可以将其划掉,而不是写
if ( 3 > 0 )
{
fun(2);
printf("%d",2);
fun(1);
}
(应用--n的逻辑)
重复这两个fun
。你可以在这个上做腿部工作
数字2 - 您不必从函数
收集返回值答案 2 :(得分:0)
我想回答你的第二个问题关于存储被调用函数返回的值。 被调用函数返回的答案可以通过两种方式显示。 No.1 - 您无需将其存储在调用函数的任何变量中,并按如下方式直接打印:
#include<stdio.h>
#include<conio.h>
void main()
{
int a=10, b=9, add(int,int);
printf("Sum of %d and %d is : %d",a,b,add(a,b));
getch();
}
int add(int m,int n)
{
return(m+n);
}
这里,函数调用已经写入printf()函数,因此消除了对额外变量的需求 No.2-另一种方式和相同的代码 -
#include<stdio.h>
#include<conio.h>
void main()
{
clrscr();
int a=10,b=9,c,add(int,int);
c=add(a,b);
printf("Sum of %d and %d is : %d",a,b,c);
getch();
}
int add(int m,int n)
{
return(m+n);
}
所以,你确实需要第二种方法的变量。因为必须要有东西来捕捉被调用函数抛出的值