void foo(int n, int sum)
{
int k = 0, j = 0;
if (n == 0) return;
k = n % 10;
j = n / 10;
sum = sum + k;
foo (j, sum);
printf ("%d,", k);
}
int main ()
{
int a = 2048, sum = 0;
foo (a, sum);
printf ("%d\n", sum);
getchar();
}
对我而言,这应该是4,0,2,8,0 但是,当我执行它时,它给了我2,0,4,8,0
答案 0 :(得分:1)
如代码所示,参数sum
到foo
并不真正相关,因为它是按值传递的,因此主函数printf ("%d\n", sum)
中的最后一个语句将打印{{1}无论0
内发生了什么。这是您在程序生成的输出中看到的最后一个foo
。
现在,函数0
本身接受参数foo
,执行整数除以10,并递归调用自身,直到n
为零。这实际上意味着它将打印输入数字的十进制数字,这是您在输出中看到的...
答案 1 :(得分:0)
它被称为对函数的递归调用。
内部递归以 ExtendedPropertyDefinition PR_Folder_Path = new ExtendedPropertyDefinition(26293, MapiPropertyType.String);
PropertySet psPropSet = new PropertySet(BasePropertySet.FirstClassProperties);
psPropSet.Add(PR_Folder_Path);
FolderId rfRootFolderid = new FolderId(WellKnownFolderName.Root, mbMailboxname);
FolderView fvFolderView = new FolderView(1000);
fvFolderView.Traversal = FolderTraversal.Deep;
fvFolderView.PropertySet = psPropSet;
SearchFilter sfSearchFilter = new SearchFilter.IsEqualTo(FolderSchema.FolderClass, "IPF.Appointment");
FindFoldersResults ffoldres = service.FindFolders(rfRootFolderid, sfSearchFilter, fvFolderView);
if (ffoldres.Folders.Count > 0) {
foreach (Folder fld in ffoldres.Folders) {
Console.WriteLine(fld.Id.ToString() + " " + fld.DisplayName);
}
}
LAST IN FIRST OUT类型
现在,在您的情况下,它首先打印上次调用stack
函数
执行程序的步骤是这样的,结果将进入堆栈
1 - 1次调用foo
foo
k = 8
值
2 - 第2次调用[{1}}
的foo
值
3 - 3次呼叫k = 4
foo
k = 0
值
第4 - 4次调用foo
<{1}}
k = 2
值
如前所述,它将像堆栈一样工作,因此程序的输出将是
2 0 4 8
如果您希望将4,0,2,8,0
作为输出,则需要相应地编写逻辑:)
答案 2 :(得分:0)
是的,你得到的输出是完全正确的。
在main()
中,使用foo()
和a=2048
调用sum=0
。
在foo()
我们有n=2048
,if条件会计算k
的值,即(n%10
)和j
,即({ {1}})直到n/10
等于n
。
现在,由于0
以foo()
和j
为参数进行递归调用,因此每次迭代中sum
的值被推送到堆栈并弹出在满足k
条件时退出。
因此,如果你追踪程序,你得到n==0
的值,它被推送到相同的序列堆叠,因此在弹出元素时我们有k=8,4,0,2
。